Revved to chromium 7f6805bd9257180e07cb6924ea41bcb76cfa462b refs/remotes/origin/HEAD
filter gyp out of build/landmines.py
filter pepper out of mojo/examples/BUILD.gn
filter html_viewer out of mojo/services/BUILD.gn
filter js out of mojo/BUILD.gn
filter js/bindings out of mojo/public/BUILD.gn
applied patch gpu_media.patch
applied patch cc_strip_video.patch
applied patch ui_test_support.patch
applied patch remove_ipc_deps.patch
applied patch ui_compositor.patch
applied patch net_sql.patch
diff --git a/DEPS b/DEPS
index d60f4db..2301210 100644
--- a/DEPS
+++ b/DEPS
@@ -30,12 +30,12 @@
'skia_git': 'https://skia.googlesource.com',
'boringssl_git': 'https://boringssl.googlesource.com',
'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
- 'skia_revision': '5bb9700b7ef952f2664e059afb4f9f137f7d5a7d',
+ 'skia_revision': '783991585be67da3286680d850a99c5410885965',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Skia
# and V8 without interference from each other.
'v8_branch': 'trunk',
- 'v8_revision': '86da2033a81f5e51ea57028027be6eac208b9dfb', # from svn revision 24398
+ 'v8_revision': 'b287d3641c8169c74f83a44b33ada13cf3cefaf2', # from svn revision 24398
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
@@ -109,7 +109,7 @@
Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + '034e9a9747e0983bc19808ea70e469bc8342081f',
'src/third_party/libyuv':
- Var('chromium_git') + '/external/libyuv.git' + '@' + '455c66b4375d72984b79249616d0a708ad568894',
+ Var('chromium_git') + '/external/libyuv.git' + '@' + '9107460c7f76a10cc4122d91e62b0580eacd376e',
'src/third_party/smhasher/src':
Var('chromium_git') + '/external/smhasher.git' + '@' + 'e87738e57558e0ec472b2fc3a643b838e5b6e88f',
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 18f2b01..d783ee0 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1227,6 +1227,7 @@
"process/memory_unittest_mac.mm",
"process/process_metrics_unittest.cc",
"process/process_metrics_unittest_ios.cc",
+ "process/process_unittest.cc",
"process/process_util_unittest.cc",
"process/process_util_unittest_ios.cc",
"profiler/tracked_time_unittest.cc",
@@ -1338,6 +1339,7 @@
"process/memory_unittest.cc",
"process/memory_unittest_mac.h",
"process/memory_unittest_mac.mm",
+ "process/process_unittest.cc",
"process/process_util_unittest.cc",
]
diff --git a/base/OWNERS b/base/OWNERS
index 04e7a6f..a014c74 100644
--- a/base/OWNERS
+++ b/base/OWNERS
@@ -1,12 +1,14 @@
mark@chromium.org
darin@chromium.org
-willchan@chromium.org
ajwong@chromium.org
thakis@chromium.org
danakj@chromium.org
rvargas@chromium.org
thestig@chromium.org
+# On extended leave.
+willchan@chromium.org
+
per-file *.isolate=csharp@chromium.org
per-file *.isolate=maruel@chromium.org
per-file bind.h=ajwong@chromium.org
diff --git a/base/android/BUILD.gn b/base/android/BUILD.gn
new file mode 100644
index 0000000..befe397
--- /dev/null
+++ b/base/android/BUILD.gn
@@ -0,0 +1,18 @@
+import("//build/config/android/config.gni")
+
+assert(is_android)
+assert(!is_android_webview_build)
+
+shared_library("chromium_android_linker") {
+ sources = [ "linker/linker_jni.cc" ]
+ # The NDK contains the crazy_linker here:
+ # '<(android_ndk_root)/crazy_linker.gyp:crazy_linker'
+ # However, we use our own fork. See bug 384700.
+ deps = [ "//third_party/android_crazy_linker" ]
+
+ # TODO(GYP):
+ # The crazy linker is never instrumented.
+ #'cflags!': [
+ #'-finstrument-functions',
+ #],
+}
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java
index 2b3cb09..41104f0 100644
--- a/base/android/java/src/org/chromium/base/library_loader/Linker.java
+++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java
@@ -826,7 +826,7 @@
sCurrentLoadAddress = libInfo.mLoadAddress + libInfo.mLoadSize;
}
- sLoadedLibraries.put(libName, libInfo);
+ sLoadedLibraries.put(sharedRelRoName, libInfo);
if (DEBUG) Log.i(TAG, "Library details " + libInfo.toString());
}
}
diff --git a/base/base.gyp b/base/base.gyp
index 41fac4f..95f6f7d 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -564,6 +564,7 @@
'process/memory_unittest_mac.mm',
'process/process_metrics_unittest.cc',
'process/process_metrics_unittest_ios.cc',
+ 'process/process_unittest.cc',
'process/process_util_unittest.cc',
'profiler/tracked_time_unittest.cc',
'rand_util_unittest.cc',
@@ -683,6 +684,7 @@
'sources/': [
# Only test the iOS-meaningful portion of process_utils.
['exclude', '^process/memory_unittest'],
+ ['exclude', '^process/process_unittest\\.cc$'],
['exclude', '^process/process_util_unittest\\.cc$'],
['include', '^process/process_util_unittest_ios\\.cc$'],
# Requires spawning processes.
@@ -1404,7 +1406,7 @@
'includes': [ '../build/java.gypi' ],
},
{
- # TODO(GN)
+ # GN: //base/android/chromium_android_linker
'target_name': 'chromium_android_linker',
'type': 'shared_library',
'conditions': [
diff --git a/base/base_nacl.gyp b/base/base_nacl.gyp
index 0816d31..7221d2a 100644
--- a/base/base_nacl.gyp
+++ b/base/base_nacl.gyp
@@ -67,5 +67,60 @@
},
],
}],
+ ['disable_nacl==0', {
+ 'targets': [
+ {
+ 'target_name': 'base_nacl_nonsfi',
+ 'type': 'none',
+ 'include_dirs': [
+ '<(DEPTH)/native_client/src/public/linux_syscalls',
+ ],
+ 'variables': {
+ 'base_target': 1,
+ 'nacl_untrusted_build': 1,
+ 'nlib_target': 'libbase_nacl_nonsfi.a',
+ 'build_glibc': 0,
+ 'build_newlib': 0,
+ 'build_irt': 0,
+ 'build_pnacl_newlib': 0,
+ 'build_nonsfi_helper': 1,
+
+ 'sources': [
+ 'base_switches.cc',
+ 'base_switches.h',
+
+ # For PathExists and ReadFromFD.
+ 'files/file_util_posix.cc',
+
+ # For MessageLoopForIO based on libevent.
+ 'message_loop/message_pump_libevent.cc',
+ 'message_loop/message_pump_libevent.h',
+
+ # For UnixDomainSocket::SendMsg and RecvMsg.
+ 'posix/unix_domain_socket_linux.cc',
+
+ # For GetKnownDeadTerminationStatus and GetTerminationStatus.
+ 'process/kill_posix.cc',
+
+ # Unlike libbase_nacl, for Non-SFI build, we need to use
+ # rand_util_posix for random implementation, instead of
+ # rand_util_nacl.cc, which is based on IRT. rand_util_nacl.cc is
+ # excluded below.
+ 'rand_util_posix.cc',
+
+ # For CancelableSyncSocket.
+ 'sync_socket_nacl.cc',
+ ],
+ },
+ 'sources!': [
+ 'rand_util_nacl.cc',
+ ],
+ 'dependencies': [
+ '<(DEPTH)/native_client/tools.gyp:prep_toolchain',
+ '<(DEPTH)/third_party/libevent/libevent_nacl_nonsfi.gyp:event_nacl_nonsfi',
+ ],
+ },
+ ],
+ }],
],
}
diff --git a/base/build_time.cc b/base/build_time.cc
index 760269a..86503e2 100644
--- a/base/build_time.cc
+++ b/base/build_time.cc
@@ -16,7 +16,11 @@
//
// __DATE__ is exactly "Mmm DD YYYY".
// __TIME__ is exactly "hh:mm:ss".
+#if defined(DONT_EMBED_BUILD_METADATA)
+ const char kDateTime[] = "Sep 02 2008 08:00:00 PST";
+#else
const char kDateTime[] = __DATE__ " " __TIME__ " PST";
+#endif
bool result = Time::FromString(kDateTime, &integral_build_time);
DCHECK(result);
return integral_build_time;
diff --git a/base/build_time_unittest.cc b/base/build_time_unittest.cc
index 399a53f..aac64a7 100644
--- a/base/build_time_unittest.cc
+++ b/base/build_time_unittest.cc
@@ -7,7 +7,11 @@
#include "testing/gtest/include/gtest/gtest.h"
TEST(BuildTime, DateLooksValid) {
+#if !defined(DONT_EMBED_BUILD_METADATA)
char build_date[] = __DATE__;
+#else
+ char build_date[] = "Sep 02 2008";
+#endif
EXPECT_EQ(11u, strlen(build_date));
EXPECT_EQ(' ', build_date[3]);
@@ -15,7 +19,11 @@
}
TEST(BuildTime, TimeLooksValid) {
+#if defined(DONT_EMBED_BUILD_METADATA)
+ char build_time[] = "08:00:00";
+#else
char build_time[] = __TIME__;
+#endif
EXPECT_EQ(8u, strlen(build_time));
EXPECT_EQ(':', build_time[2]);
diff --git a/base/compiler_specific.h b/base/compiler_specific.h
index ba57cc3..6210d1a 100644
--- a/base/compiler_specific.h
+++ b/base/compiler_specific.h
@@ -94,11 +94,17 @@
// (Typically used to silence a compiler warning when the assignment
// is important for some other reason.)
// Use like:
-// int x ALLOW_UNUSED = ...;
+// int x = ...;
+// ALLOW_UNUSED_LOCAL(x);
+#define ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0
+
+// Annotate a typedef or function indicating it's ok if it's not used.
+// Use like:
+// typedef Foo Bar ALLOW_UNUSED_TYPE;
#if defined(COMPILER_GCC)
-#define ALLOW_UNUSED __attribute__((unused))
+#define ALLOW_UNUSED_TYPE __attribute__((unused))
#else
-#define ALLOW_UNUSED
+#define ALLOW_UNUSED_TYPE
#endif
// Annotate a function indicating it should not be inlined.
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 561f5c7..5a94cef 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -59,6 +59,7 @@
namespace base {
+#if !defined(__native_client_nonsfi__)
namespace {
#if defined(OS_BSD) || defined(OS_MACOSX) || defined(OS_NACL)
@@ -345,6 +346,7 @@
return success;
}
+#endif // !defined(__native_client_nonsfi__)
bool PathExists(const FilePath& path) {
ThreadRestrictions::AssertIOAllowed();
@@ -356,6 +358,7 @@
return access(path.value().c_str(), F_OK) == 0;
}
+#if !defined(__native_client_nonsfi__)
bool PathIsWritable(const FilePath& path) {
ThreadRestrictions::AssertIOAllowed();
return access(path.value().c_str(), W_OK) == 0;
@@ -368,6 +371,7 @@
return S_ISDIR(file_info.st_mode);
return false;
}
+#endif // !defined(__native_client_nonsfi__)
bool ReadFromFD(int fd, char* buffer, size_t bytes) {
size_t total_read = 0;
@@ -381,6 +385,7 @@
return total_read == bytes;
}
+#if !defined(__native_client_nonsfi__)
bool CreateSymbolicLink(const FilePath& target_path,
const FilePath& symlink_path) {
DCHECK(!symlink_path.empty());
@@ -920,4 +925,6 @@
#endif // !defined(OS_MACOSX)
} // namespace internal
+
+#endif // !defined(__native_client_nonsfi__)
} // namespace base
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
index 6ebe32e..95a16f2 100644
--- a/base/logging_unittest.cc
+++ b/base/logging_unittest.cc
@@ -240,7 +240,8 @@
// looking in the global namespace.
namespace nested_test {
class Streamable {};
- ALLOW_UNUSED std::ostream& operator<<(std::ostream& out, const Streamable&) {
+ ALLOW_UNUSED_TYPE std::ostream& operator<<(std::ostream& out,
+ const Streamable&) {
return out << "Streamable";
}
TEST_F(LoggingTest, StreamingWstringFindsCorrectOperator) {
diff --git a/base/mac/foundation_util_unittest.mm b/base/mac/foundation_util_unittest.mm
index 916a13b..e60a0f6 100644
--- a/base/mac/foundation_util_unittest.mm
+++ b/base/mac/foundation_util_unittest.mm
@@ -331,12 +331,12 @@
#endif // defined(ARCH_CPU_64_BITS)
NSInteger some_nsinteger;
- FormatNSIntegerAsType* pointer_to_some_nsinteger ALLOW_UNUSED =
- &some_nsinteger;
+ FormatNSIntegerAsType* pointer_to_some_nsinteger = &some_nsinteger;
+ ALLOW_UNUSED_LOCAL(pointer_to_some_nsinteger);
NSUInteger some_nsuinteger;
- FormatNSUIntegerAsType* pointer_to_some_nsuinteger ALLOW_UNUSED =
- &some_nsuinteger;
+ FormatNSUIntegerAsType* pointer_to_some_nsuinteger = &some_nsuinteger;
+ ALLOW_UNUSED_LOCAL(pointer_to_some_nsuinteger);
// Check that format specifier works correctly for NSInteger.
const struct {
diff --git a/base/macros.h b/base/macros.h
index 2e3fc09..f89d7d1 100644
--- a/base/macros.h
+++ b/base/macros.h
@@ -69,8 +69,12 @@
// DEPRECATED: Just use |arraysize()|, now that C++11 has removed the
// limitations that forced the use of |ARRAYSIZE_UNSAFE()|.
-// TODO(viettrungluu): Convert all instances and delete. crbug.com/423134
+// TODO(viettrungluu): Convert all instances and delete. (The only uses are now
+// in Blink; the ifdef is to prevent it from reappearing in Chromium.)
+// crbug.com/423134
+#if defined(BLINK_PLATFORM) || defined(BLINK_PLATFORM_IMPLEMENTATION)
#define ARRAYSIZE_UNSAFE(a) arraysize(a)
+#endif
// Use implicit_cast as a safe version of static_cast or const_cast
diff --git a/base/memory/discardable_memory_unittest.cc b/base/memory/discardable_memory_unittest.cc
index 2bdc079..600475e 100644
--- a/base/memory/discardable_memory_unittest.cc
+++ b/base/memory/discardable_memory_unittest.cc
@@ -103,6 +103,22 @@
}
#endif
+// Test behavior when creating enough instances that could use up a 32-bit
+// address space.
+TEST_P(DiscardableMemoryTest, AddressSpace) {
+ const size_t kLargeSize = 4 * 1024 * 1024; // 4MiB.
+ const size_t kNumberOfInstances = 1024 + 1; // >4GiB total.
+
+ scoped_ptr<DiscardableMemory> instances[kNumberOfInstances];
+ for (auto& memory : instances) {
+ memory = CreateLockedMemory(kLargeSize);
+ ASSERT_TRUE(memory);
+ void* addr = memory->Memory();
+ ASSERT_NE(nullptr, addr);
+ memory->Unlock();
+ }
+}
+
std::vector<DiscardableMemoryType> GetSupportedDiscardableMemoryTypes() {
std::vector<DiscardableMemoryType> supported_types;
DiscardableMemory::GetSupportedTypes(&supported_types);
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index c01e542..f1d0d3b 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -100,7 +100,7 @@
#if defined(OS_IOS)
typedef MessagePumpIOSForIO MessagePumpForIO;
-#elif defined(OS_NACL)
+#elif defined(OS_NACL) && !defined(__native_client_nonsfi__)
typedef MessagePumpDefault MessagePumpForIO;
#elif defined(OS_POSIX)
typedef MessagePumpLibevent MessagePumpForIO;
@@ -676,7 +676,7 @@
//------------------------------------------------------------------------------
// MessageLoopForIO
-#if !defined(OS_NACL)
+#if !defined(OS_NACL) || defined(__native_client_nonsfi__)
void MessageLoopForIO::AddIOObserver(
MessageLoopForIO::IOObserver* io_observer) {
ToPumpIO(pump_.get())->AddIOObserver(io_observer);
@@ -714,6 +714,6 @@
}
#endif
-#endif // !defined(OS_NACL)
+#endif // !defined(OS_NACL) || defined(__native_client_nonsfi__)
} // namespace base
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index bc98251..a180cc3 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -596,7 +596,7 @@
return loop && loop->type() == MessageLoop::TYPE_IO;
}
-#if !defined(OS_NACL)
+#if !defined(OS_NACL) || defined(__native_client_nonsfi__)
#if defined(OS_WIN)
typedef MessagePumpForIO::IOHandler IOHandler;
@@ -642,7 +642,7 @@
FileDescriptorWatcher *controller,
Watcher *delegate);
#endif // defined(OS_IOS) || defined(OS_POSIX)
-#endif // !defined(OS_NACL)
+#endif // !defined(OS_NACL) || defined(__native_client_nonsfi__)
};
// Do not add any member variables to MessageLoopForIO! This is important b/c
diff --git a/base/posix/unix_domain_socket_linux.cc b/base/posix/unix_domain_socket_linux.cc
index 51b936b..20a5944 100644
--- a/base/posix/unix_domain_socket_linux.cc
+++ b/base/posix/unix_domain_socket_linux.cc
@@ -6,7 +6,6 @@
#include <errno.h>
#include <sys/socket.h>
-#include <sys/uio.h>
#include <unistd.h>
#include <vector>
@@ -18,8 +17,13 @@
#include "base/posix/eintr_wrapper.h"
#include "base/stl_util.h"
+#if !defined(__native_client_nonsfi__)
+#include <sys/uio.h>
+#endif
+
const size_t UnixDomainSocket::kMaxFileDescriptors = 16;
+#if !defined(__native_client_nonsfi__)
// Creates a connected pair of UNIX-domain SOCK_SEQPACKET sockets, and passes
// ownership of the newly allocated file descriptors to |one| and |two|.
// Returns true on success.
@@ -37,6 +41,7 @@
const int enable = 1;
return setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable)) == 0;
}
+#endif // !defined(__native_client_nonsfi__)
// static
bool UnixDomainSocket::SendMsg(int fd,
@@ -106,8 +111,14 @@
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
- char control_buffer[CMSG_SPACE(sizeof(int) * kMaxFileDescriptors) +
- CMSG_SPACE(sizeof(struct ucred))];
+ const size_t kControlBufferSize =
+ CMSG_SPACE(sizeof(int) * kMaxFileDescriptors)
+#if !defined(__native_client_nonsfi__)
+ // The PNaCl toolchain for Non-SFI binary build does not support ucred.
+ + CMSG_SPACE(sizeof(struct ucred))
+#endif
+ ;
+ char control_buffer[kControlBufferSize];
msg.msg_control = control_buffer;
msg.msg_controllen = sizeof(control_buffer);
@@ -130,21 +141,29 @@
wire_fds = reinterpret_cast<int*>(CMSG_DATA(cmsg));
wire_fds_len = payload_len / sizeof(int);
}
+#if !defined(__native_client_nonsfi__)
+ // The PNaCl toolchain for Non-SFI binary build does not support
+ // SCM_CREDENTIALS.
if (cmsg->cmsg_level == SOL_SOCKET &&
cmsg->cmsg_type == SCM_CREDENTIALS) {
DCHECK(payload_len == sizeof(struct ucred));
DCHECK(pid == -1);
pid = reinterpret_cast<struct ucred*>(CMSG_DATA(cmsg))->pid;
}
+#endif
}
}
+#if !defined(__native_client_nonsfi__)
+ // The PNaCl toolchain for Non-SFI binary build does not support
+ // MSG_TRUNC or MSG_CTRUNC.
if (msg.msg_flags & MSG_TRUNC || msg.msg_flags & MSG_CTRUNC) {
for (unsigned i = 0; i < wire_fds_len; ++i)
close(wire_fds[i]);
errno = EMSGSIZE;
return -1;
}
+#endif
if (wire_fds) {
for (unsigned i = 0; i < wire_fds_len; ++i)
@@ -165,6 +184,7 @@
return r;
}
+#if !defined(__native_client_nonsfi__)
// static
ssize_t UnixDomainSocket::SendRecvMsg(int fd,
uint8_t* reply,
@@ -222,3 +242,4 @@
return reply_len;
}
+#endif // !defined(__native_client_nonsfi__)
diff --git a/base/posix/unix_domain_socket_linux.h b/base/posix/unix_domain_socket_linux.h
index 59bb884..5281875 100644
--- a/base/posix/unix_domain_socket_linux.h
+++ b/base/posix/unix_domain_socket_linux.h
@@ -21,10 +21,12 @@
// Maximum number of file descriptors that can be read by RecvMsg().
static const size_t kMaxFileDescriptors;
+#if !defined(__native_client_nonsfi__)
// Use to enable receiving process IDs in RecvMsgWithPid. Should be called on
// the receiving socket (i.e., the socket passed to RecvMsgWithPid). Returns
// true if successful.
static bool EnableReceiveProcessId(int fd);
+#endif // !defined(__native_client_nonsfi__)
// Use sendmsg to write the given msg and include a vector of file
// descriptors. Returns true if successful.
@@ -50,6 +52,7 @@
ScopedVector<base::ScopedFD>* fds,
base::ProcessId* pid);
+#if !defined(__native_client_nonsfi__)
// Perform a sendmsg/recvmsg pair.
// 1. This process creates a UNIX SEQPACKET socketpair. Using
// connection-oriented sockets (SEQPACKET or STREAM) is critical here,
@@ -82,6 +85,7 @@
int recvmsg_flags,
int* result_fd,
const Pickle& request);
+#endif // !defined(__native_client_nonsfi__)
private:
// Similar to RecvMsg, but allows to specify |flags| for recvmsg(2).
static ssize_t RecvMsgWithFlags(int fd,
diff --git a/base/process/kill_posix.cc b/base/process/kill_posix.cc
index d4ca726..bff7be4 100644
--- a/base/process/kill_posix.cc
+++ b/base/process/kill_posix.cc
@@ -22,6 +22,7 @@
namespace {
+#if !defined(__native_client_nonsfi__)
bool WaitpidWithTimeout(ProcessHandle handle,
int* status,
base::TimeDelta wait) {
@@ -83,6 +84,7 @@
return ret_pid > 0;
}
+#endif // !defined(__native_client_nonsfi__)
TerminationStatus GetTerminationStatusImpl(ProcessHandle handle,
bool can_block,
@@ -130,6 +132,7 @@
} // namespace
+#if !defined(__native_client_nonsfi__)
// Attempts to kill the process identified by the given process
// entry structure. Ignores specified exit_code; posix can't force that.
// Returns true if this is successful, false otherwise.
@@ -191,6 +194,7 @@
DPLOG(ERROR) << "Unable to terminate process group " << process_group_id;
return result;
}
+#endif // !defined(__native_client_nonsfi__)
TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
return GetTerminationStatusImpl(handle, false /* can_block */, exit_code);
@@ -206,6 +210,7 @@
return GetTerminationStatusImpl(handle, true /* can_block */, exit_code);
}
+#if !defined(__native_client_nonsfi__)
bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
int status;
if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) {
@@ -354,7 +359,7 @@
bool WaitForSingleProcess(ProcessHandle handle, base::TimeDelta wait) {
ProcessHandle parent_pid = GetParentProcessId(handle);
- ProcessHandle our_pid = Process::Current().handle();
+ ProcessHandle our_pid = GetCurrentProcessHandle();
if (parent_pid != our_pid) {
#if defined(OS_MACOSX)
// On Mac we can wait on non child processes.
@@ -478,5 +483,6 @@
}
#endif // !defined(OS_MACOSX)
+#endif // !defined(__native_client_nonsfi__)
} // namespace base
diff --git a/base/process/process.h b/base/process/process.h
index 20e8884..7019474 100644
--- a/base/process/process.h
+++ b/base/process/process.h
@@ -7,53 +7,81 @@
#include "base/base_export.h"
#include "base/basictypes.h"
+#include "base/move.h"
#include "base/process/process_handle.h"
#include "build/build_config.h"
+#if defined(OS_WIN)
+#include "base/win/scoped_handle.h"
+#endif
+
namespace base {
+// Provides a move-only encapsulation of a process.
+//
+// This object is not tied to the lifetime of the underlying process: the
+// process may be killed and this object may still around, and it will still
+// claim to be valid. The actual behavior in that case is OS dependent like so:
+//
+// Windows: The underlying ProcessHandle will be valid after the process dies
+// and can be used to gather some information about that process, but most
+// methods will obviously fail.
+//
+// POSIX: The underlying PorcessHandle is not guaranteed to remain valid after
+// the process dies, and it may be reused by the system, which means that it may
+// end up pointing to the wrong process.
class BASE_EXPORT Process {
+ MOVE_ONLY_TYPE_FOR_CPP_03(Process, RValue)
+
public:
- Process() : process_(kNullProcessHandle) {
- }
+ explicit Process(ProcessHandle handle = kNullProcessHandle);
- explicit Process(ProcessHandle handle) : process_(handle) {
- }
+ // Move constructor for C++03 move emulation of this type.
+ Process(RValue other);
- // A handle to the current process.
+ // The destructor does not terminate the process.
+ ~Process() {}
+
+ // Move operator= for C++03 move emulation of this type.
+ Process& operator=(RValue other);
+
+ // Returns an object for the current process.
static Process Current();
+ // Returns true if processes can be backgrounded.
static bool CanBackgroundProcesses();
- // Get/Set the handle for this process. The handle will be 0 if the process
- // is no longer running.
- ProcessHandle handle() const { return process_; }
- void set_handle(ProcessHandle handle) {
- process_ = handle;
- }
+ // Returns true if this objects represents a valid process.
+ bool IsValid() const;
+
+ // Returns a handle for this process. There is no guarantee about when that
+ // handle becomes invalid because this object retains ownership.
+ ProcessHandle Handle() const;
+
+ // Returns a second object that represents this process.
+ Process Duplicate() const;
// Get the PID for this process.
ProcessId pid() const;
- // Is the this process the current process.
+ // Returns true if this process is the current process.
bool is_current() const;
// Close the process handle. This will not terminate the process.
void Close();
- // Terminates the process with extreme prejudice. The given result code will
- // be the exit code of the process. If the process has already exited, this
- // will do nothing.
+ // Terminates the process with extreme prejudice. The given |result_code| will
+ // be the exit code of the process.
+ // NOTE: On POSIX |result_code| is ignored.
void Terminate(int result_code);
// A process is backgrounded when it's priority is lower than normal.
// Return true if this process is backgrounded, false otherwise.
bool IsProcessBackgrounded() const;
- // Set a process as backgrounded. If value is true, the priority
- // of the process will be lowered. If value is false, the priority
- // of the process will be made "normal" - equivalent to default
- // process priority.
+ // Set a process as backgrounded. If value is true, the priority of the
+ // process will be lowered. If value is false, the priority of the process
+ // will be made "normal" - equivalent to default process priority.
// Returns true if the priority was changed, false otherwise.
bool SetProcessBackgrounded(bool value);
@@ -62,7 +90,12 @@
int GetPriority() const;
private:
+#if defined(OS_WIN)
+ bool is_current_process_;
+ win::ScopedHandle process_;
+#else
ProcessHandle process_;
+#endif
};
} // namespace base
diff --git a/base/process/process_linux.cc b/base/process/process_linux.cc
index 2c22d26..59ee288 100644
--- a/base/process/process_linux.cc
+++ b/base/process/process_linux.cc
@@ -17,6 +17,7 @@
namespace base {
namespace {
+
const int kForegroundPriority = 0;
#if defined(OS_CHROMEOS)
@@ -62,10 +63,37 @@
#else
const int kBackgroundPriority = 5;
#endif
+
+struct CheckForNicePermission {
+ CheckForNicePermission() : can_reraise_priority(false) {
+ // We won't be able to raise the priority if we don't have the right rlimit.
+ // The limit may be adjusted in /etc/security/limits.conf for PAM systems.
+ struct rlimit rlim;
+ if ((getrlimit(RLIMIT_NICE, &rlim) == 0) &&
+ (20 - kForegroundPriority) <= static_cast<int>(rlim.rlim_cur)) {
+ can_reraise_priority = true;
+ }
+ };
+
+ bool can_reraise_priority;
+};
+
+} // namespace
+
+// static
+bool Process::CanBackgroundProcesses() {
+#if defined(OS_CHROMEOS)
+ if (cgroups.Get().enabled)
+ return true;
+#endif
+
+ static LazyInstance<CheckForNicePermission> check_for_nice_permission =
+ LAZY_INSTANCE_INITIALIZER;
+ return check_for_nice_permission.Get().can_reraise_priority;
}
bool Process::IsProcessBackgrounded() const {
- DCHECK(process_);
+ DCHECK(IsValid());
#if defined(OS_CHROMEOS)
if (cgroups.Get().enabled) {
@@ -87,7 +115,7 @@
}
bool Process::SetProcessBackgrounded(bool background) {
- DCHECK(process_);
+ DCHECK(IsValid());
#if defined(OS_CHROMEOS)
if (cgroups.Get().enabled) {
@@ -108,30 +136,4 @@
return result == 0;
}
-struct CheckForNicePermission {
- CheckForNicePermission() : can_reraise_priority(false) {
- // We won't be able to raise the priority if we don't have the right rlimit.
- // The limit may be adjusted in /etc/security/limits.conf for PAM systems.
- struct rlimit rlim;
- if ((getrlimit(RLIMIT_NICE, &rlim) == 0) &&
- (20 - kForegroundPriority) <= static_cast<int>(rlim.rlim_cur)) {
- can_reraise_priority = true;
- }
- };
-
- bool can_reraise_priority;
-};
-
-// static
-bool Process::CanBackgroundProcesses() {
-#if defined(OS_CHROMEOS)
- if (cgroups.Get().enabled)
- return true;
-#endif
-
- static LazyInstance<CheckForNicePermission> check_for_nice_permission =
- LAZY_INSTANCE_INITIALIZER;
- return check_for_nice_permission.Get().can_reraise_priority;
-}
-
} // namespace base
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index 3d8b31d..ea8fd8c 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -13,15 +13,54 @@
namespace base {
+Process::Process(ProcessHandle handle) : process_(handle) {
+ CHECK_NE(handle, GetCurrentProcessHandle());
+}
+
+Process::Process(RValue other)
+ : process_(other.object->process_) {
+ other.object->Close();
+}
+
+Process& Process::operator=(RValue other) {
+ if (this != other.object) {
+ process_ = other.object->process_;
+ other.object->Close();
+ }
+ return *this;
+}
+
// static
Process Process::Current() {
- return Process(GetCurrentProcessHandle());
+ Process process;
+ process.process_ = GetCurrentProcessHandle();
+ return process.Pass();
+}
+
+#if !defined(OS_LINUX)
+// static
+bool Process::CanBackgroundProcesses() {
+ return false;
+}
+#endif // !defined(OS_LINUX)
+
+bool Process::IsValid() const {
+ return process_ != kNullProcessHandle;
+}
+
+ProcessHandle Process::Handle() const {
+ return process_;
+}
+
+Process Process::Duplicate() const {
+ if (is_current())
+ return Current();
+
+ return Process(process_);
}
ProcessId Process::pid() const {
- if (process_ == 0)
- return 0;
-
+ DCHECK(IsValid());
return GetProcId(process_);
}
@@ -30,7 +69,7 @@
}
void Process::Close() {
- process_ = 0;
+ process_ = kNullProcessHandle;
// if the process wasn't terminated (so we waited) or the state
// wasn't already collected w/ a wait from process_utils, we're gonna
// end up w/ a zombie when it does finally exit.
@@ -38,8 +77,7 @@
void Process::Terminate(int result_code) {
// result_code isn't supportable.
- if (!process_)
- return;
+ DCHECK(IsValid());
// We don't wait here. It's the responsibility of other code to reap the
// child.
KillProcess(process_, result_code, false);
@@ -48,6 +86,7 @@
#if !defined(OS_LINUX)
bool Process::IsProcessBackgrounded() const {
// See SetProcessBackgrounded().
+ DCHECK(IsValid());
return false;
}
@@ -55,18 +94,13 @@
// POSIX only allows lowering the priority of a process, so if we
// were to lower it we wouldn't be able to raise it back to its initial
// priority.
+ DCHECK(IsValid());
return false;
}
-
-// static
-bool Process::CanBackgroundProcesses() {
- return false;
-}
-
-#endif
+#endif // !defined(OS_LINUX)
int Process::GetPriority() const {
- DCHECK(process_);
+ DCHECK(IsValid());
return getpriority(PRIO_PROCESS, process_);
}
diff --git a/base/process/process_unittest.cc b/base/process/process_unittest.cc
new file mode 100644
index 0000000..66d6e63
--- /dev/null
+++ b/base/process/process_unittest.cc
@@ -0,0 +1,161 @@
+// 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 "base/process/process.h"
+
+#include "base/process/kill.h"
+#include "base/test/multiprocess_test.h"
+#include "base/test/test_timeouts.h"
+#include "base/threading/platform_thread.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/multiprocess_func_list.h"
+
+
+namespace {
+
+#if defined(OS_WIN)
+const int kExpectedStillRunningExitCode = 0x102;
+#else
+const int kExpectedStillRunningExitCode = 0;
+#endif
+
+} // namespace
+
+namespace base {
+
+class ProcessTest : public MultiProcessTest {
+};
+
+TEST_F(ProcessTest, Create) {
+ Process process(SpawnChild("SimpleChildProcess"));
+ ASSERT_TRUE(process.IsValid());
+ ASSERT_FALSE(process.is_current());
+ process.Close();
+ ASSERT_FALSE(process.IsValid());
+}
+
+TEST_F(ProcessTest, CreateCurrent) {
+ Process process = Process::Current();
+ ASSERT_TRUE(process.IsValid());
+ ASSERT_TRUE(process.is_current());
+ process.Close();
+ ASSERT_FALSE(process.IsValid());
+}
+
+TEST_F(ProcessTest, Move) {
+ Process process1(SpawnChild("SimpleChildProcess"));
+ EXPECT_TRUE(process1.IsValid());
+
+ Process process2;
+ EXPECT_FALSE(process2.IsValid());
+
+ process2 = process1.Pass();
+ EXPECT_TRUE(process2.IsValid());
+ EXPECT_FALSE(process1.IsValid());
+ EXPECT_FALSE(process2.is_current());
+
+ Process process3 = Process::Current();
+ process2 = process3.Pass();
+ EXPECT_TRUE(process2.is_current());
+ EXPECT_TRUE(process2.IsValid());
+ EXPECT_FALSE(process3.IsValid());
+}
+
+TEST_F(ProcessTest, Duplicate) {
+ Process process1(SpawnChild("SimpleChildProcess"));
+ ASSERT_TRUE(process1.IsValid());
+
+ Process process2 = process1.Duplicate();
+ ASSERT_TRUE(process1.IsValid());
+ ASSERT_TRUE(process2.IsValid());
+ EXPECT_EQ(process1.pid(), process2.pid());
+ EXPECT_FALSE(process1.is_current());
+ EXPECT_FALSE(process2.is_current());
+
+ process1.Close();
+ ASSERT_TRUE(process2.IsValid());
+}
+
+TEST_F(ProcessTest, DuplicateCurrent) {
+ Process process1 = Process::Current();
+ ASSERT_TRUE(process1.IsValid());
+
+ Process process2 = process1.Duplicate();
+ ASSERT_TRUE(process1.IsValid());
+ ASSERT_TRUE(process2.IsValid());
+ EXPECT_EQ(process1.pid(), process2.pid());
+ EXPECT_TRUE(process1.is_current());
+ EXPECT_TRUE(process2.is_current());
+
+ process1.Close();
+ ASSERT_TRUE(process2.IsValid());
+}
+
+MULTIPROCESS_TEST_MAIN(SleepyChildProcess) {
+ PlatformThread::Sleep(TestTimeouts::action_max_timeout());
+ return 0;
+}
+
+TEST_F(ProcessTest, Terminate) {
+ Process process(SpawnChild("SleepyChildProcess"));
+ ASSERT_TRUE(process.IsValid());
+
+ const int kDummyExitCode = 42;
+ int exit_code = kDummyExitCode;
+ EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
+ GetTerminationStatus(process.Handle(), &exit_code));
+ EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
+
+ exit_code = kDummyExitCode;
+ int kExpectedExitCode = 250;
+ process.Terminate(kExpectedExitCode);
+ WaitForSingleProcess(process.Handle(), TestTimeouts::action_max_timeout());
+
+ EXPECT_NE(TERMINATION_STATUS_STILL_RUNNING,
+ GetTerminationStatus(process.Handle(), &exit_code));
+#if !defined(OS_POSIX)
+ // The POSIX implementation actually ignores the exit_code.
+ EXPECT_EQ(kExpectedExitCode, exit_code);
+#endif
+}
+
+// Ensure that the priority of a process is restored correctly after
+// backgrounding and restoring.
+// Note: a platform may not be willing or able to lower the priority of
+// a process. The calls to SetProcessBackground should be noops then.
+TEST_F(ProcessTest, SetProcessBackgrounded) {
+ Process process(SpawnChild("SimpleChildProcess"));
+ int old_priority = process.GetPriority();
+#if defined(OS_WIN)
+ EXPECT_TRUE(process.SetProcessBackgrounded(true));
+ EXPECT_TRUE(process.IsProcessBackgrounded());
+ EXPECT_TRUE(process.SetProcessBackgrounded(false));
+ EXPECT_FALSE(process.IsProcessBackgrounded());
+#else
+ process.SetProcessBackgrounded(true);
+ process.SetProcessBackgrounded(false);
+#endif
+ int new_priority = process.GetPriority();
+ EXPECT_EQ(old_priority, new_priority);
+}
+
+// Same as SetProcessBackgrounded but to this very process. It uses
+// a different code path at least for Windows.
+TEST_F(ProcessTest, SetProcessBackgroundedSelf) {
+ Process process = Process::Current();
+ int old_priority = process.GetPriority();
+#if defined(OS_WIN)
+ EXPECT_TRUE(process.SetProcessBackgrounded(true));
+ EXPECT_TRUE(process.IsProcessBackgrounded());
+ EXPECT_TRUE(process.SetProcessBackgrounded(false));
+ EXPECT_FALSE(process.IsProcessBackgrounded());
+#else
+ process.SetProcessBackgrounded(true);
+ process.SetProcessBackgrounded(false);
+#endif
+ int new_priority = process.GetPriority();
+ EXPECT_EQ(old_priority, new_priority);
+}
+
+} // namespace base
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
index 9188fd3..d846d1a 100644
--- a/base/process/process_util_unittest.cc
+++ b/base/process/process_util_unittest.cc
@@ -311,45 +311,6 @@
remove(signal_file.c_str());
}
-// Ensure that the priority of a process is restored correctly after
-// backgrounding and restoring.
-// Note: a platform may not be willing or able to lower the priority of
-// a process. The calls to SetProcessBackground should be noops then.
-TEST_F(ProcessUtilTest, SetProcessBackgrounded) {
- base::ProcessHandle handle = SpawnChild("SimpleChildProcess");
- base::Process process(handle);
- int old_priority = process.GetPriority();
-#if defined(OS_WIN)
- EXPECT_TRUE(process.SetProcessBackgrounded(true));
- EXPECT_TRUE(process.IsProcessBackgrounded());
- EXPECT_TRUE(process.SetProcessBackgrounded(false));
- EXPECT_FALSE(process.IsProcessBackgrounded());
-#else
- process.SetProcessBackgrounded(true);
- process.SetProcessBackgrounded(false);
-#endif
- int new_priority = process.GetPriority();
- EXPECT_EQ(old_priority, new_priority);
-}
-
-// Same as SetProcessBackgrounded but to this very process. It uses
-// a different code path at least for Windows.
-TEST_F(ProcessUtilTest, SetProcessBackgroundedSelf) {
- base::Process process(base::Process::Current().handle());
- int old_priority = process.GetPriority();
-#if defined(OS_WIN)
- EXPECT_TRUE(process.SetProcessBackgrounded(true));
- EXPECT_TRUE(process.IsProcessBackgrounded());
- EXPECT_TRUE(process.SetProcessBackgrounded(false));
- EXPECT_FALSE(process.IsProcessBackgrounded());
-#else
- process.SetProcessBackgrounded(true);
- process.SetProcessBackgrounded(false);
-#endif
- int new_priority = process.GetPriority();
- EXPECT_EQ(old_priority, new_priority);
-}
-
#if defined(OS_WIN)
// TODO(estade): if possible, port this test.
TEST_F(ProcessUtilTest, GetAppOutput) {
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index 1217b50..05041b2 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -10,20 +10,83 @@
namespace base {
+Process::Process(ProcessHandle handle)
+ : is_current_process_(false),
+ process_(handle) {
+ CHECK_NE(handle, ::GetCurrentProcess());
+}
+
+Process::Process(RValue other)
+ : is_current_process_(other.object->is_current_process_),
+ process_(other.object->process_.Take()) {
+ other.object->Close();
+}
+
+Process& Process::operator=(RValue other) {
+ if (this != other.object) {
+ process_.Set(other.object->process_.Take());
+ is_current_process_ = other.object->is_current_process_;
+ other.object->Close();
+ }
+ return *this;
+}
+
+// static
+Process Process::Current() {
+ Process process;
+ process.is_current_process_ = true;
+ return process.Pass();
+}
+
+// static
+bool Process::CanBackgroundProcesses() {
+ return true;
+}
+
+bool Process::IsValid() const {
+ return process_.IsValid() || is_current();
+}
+
+ProcessHandle Process::Handle() const {
+ return is_current_process_ ? GetCurrentProcess() : process_.Get();
+}
+
+Process Process::Duplicate() const {
+ if (is_current())
+ return Current();
+
+ ProcessHandle out_handle;
+ if (!IsValid() || !::DuplicateHandle(GetCurrentProcess(),
+ Handle(),
+ GetCurrentProcess(),
+ &out_handle,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)) {
+ return Process();
+ }
+ return Process(out_handle);
+}
+
+ProcessId Process::pid() const {
+ DCHECK(IsValid());
+ return GetProcId(Handle());
+}
+
+bool Process::is_current() const {
+ return is_current_process_;
+}
+
void Process::Close() {
- if (!process_)
+ is_current_process_ = false;
+ if (!process_.IsValid())
return;
- // Don't call CloseHandle on a pseudo-handle.
- if (process_ != ::GetCurrentProcess())
- ::CloseHandle(process_);
-
- process_ = NULL;
+ process_.Close();
}
void Process::Terminate(int result_code) {
- if (!process_)
- return;
+ DCHECK(IsValid());
// Call NtTerminateProcess directly, without going through the import table,
// which might have been hooked with a buggy replacement by third party
@@ -32,12 +95,11 @@
typedef UINT (WINAPI *TerminateProcessPtr)(HANDLE handle, UINT code);
TerminateProcessPtr terminate_process = reinterpret_cast<TerminateProcessPtr>(
GetProcAddress(module, "NtTerminateProcess"));
- terminate_process(process_, result_code);
+ terminate_process(Handle(), result_code);
}
bool Process::IsProcessBackgrounded() const {
- if (!process_)
- return false; // Failure case.
+ DCHECK(IsValid());
DWORD priority = GetPriority();
if (priority == 0)
return false; // Failure case.
@@ -46,47 +108,24 @@
}
bool Process::SetProcessBackgrounded(bool value) {
- if (!process_)
- return false;
+ DCHECK(IsValid());
// Vista and above introduce a real background mode, which not only
// sets the priority class on the threads but also on the IO generated
// by it. Unfortunately it can only be set for the calling process.
DWORD priority;
- if ((base::win::GetVersion() >= base::win::VERSION_VISTA) &&
- (process_ == ::GetCurrentProcess())) {
+ if ((base::win::GetVersion() >= base::win::VERSION_VISTA) && (is_current())) {
priority = value ? PROCESS_MODE_BACKGROUND_BEGIN :
PROCESS_MODE_BACKGROUND_END;
} else {
priority = value ? BELOW_NORMAL_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS;
}
- return (::SetPriorityClass(process_, priority) != 0);
-}
-
-ProcessId Process::pid() const {
- if (process_ == 0)
- return 0;
-
- return GetProcId(process_);
-}
-
-bool Process::is_current() const {
- return process_ == GetCurrentProcess();
-}
-
-// static
-Process Process::Current() {
- return Process(::GetCurrentProcess());
-}
-
-// static
-bool Process::CanBackgroundProcesses() {
- return true;
+ return (::SetPriorityClass(Handle(), priority) != 0);
}
int Process::GetPriority() const {
- DCHECK(process_);
- return ::GetPriorityClass(process_);
+ DCHECK(IsValid());
+ return ::GetPriorityClass(Handle());
}
} // namespace base
diff --git a/base/strings/safe_sprintf.cc b/base/strings/safe_sprintf.cc
index 1c92718..5b57563 100644
--- a/base/strings/safe_sprintf.cc
+++ b/base/strings/safe_sprintf.cc
@@ -176,8 +176,7 @@
// overflowed |size_|) at any time during padding.
inline bool Pad(char pad, size_t padding, size_t len) {
DEBUG_CHECK(pad);
- DEBUG_CHECK(padding >= 0 && padding <= kSSizeMax);
- DEBUG_CHECK(len >= 0);
+ DEBUG_CHECK(padding <= kSSizeMax);
for (; padding > len; --padding) {
if (!Out(pad)) {
if (--padding) {
@@ -283,7 +282,6 @@
DEBUG_CHECK(base <= 16);
DEBUG_CHECK(!sign || base == 10);
DEBUG_CHECK(pad == '0' || pad == ' ');
- DEBUG_CHECK(padding >= 0);
DEBUG_CHECK(padding <= kSSizeMax);
DEBUG_CHECK(!(sign && prefix && *prefix));
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index 3653c96..39f32a7 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -15,22 +15,16 @@
#define ENABLE_THREAD_RESTRICTIONS 0
#endif
-class AcceleratedPresenter;
class BrowserProcessImpl;
class HistogramSynchronizer;
class NativeBackendKWallet;
class ScopedAllowWaitForLegacyWebViewApi;
class TestingAutomationProvider;
-namespace browser_sync {
-class NonFrontendDataTypeController;
-class UIModelWorker;
-}
namespace cc {
class CompletionEvent;
}
namespace chromeos {
-class AudioMixerAlsa;
class BlockingMethodCaller;
namespace system {
class StatisticsProviderImpl;
@@ -44,7 +38,6 @@
class BrowserGpuMemoryBufferManager;
class BrowserShutdownProfileDumper;
class BrowserTestBase;
-class GLHelper;
class GpuChannelHost;
class NestedMessagePumpAndroid;
class RenderWidgetResizeHelper;
@@ -58,20 +51,12 @@
class BackendImpl;
class InFlightIO;
}
-namespace media {
-class AudioOutputController;
-}
-namespace metrics {
-class MetricsService;
-}
namespace mojo {
namespace common {
class WatcherThreadManager;
}
}
namespace net {
-class FileStreamPosix;
-class FileStreamWin;
namespace internal {
class AddressTrackerLinux;
}
@@ -206,29 +191,20 @@
// END ALLOWED USAGE.
// BEGIN USAGE THAT NEEDS TO BE FIXED.
- friend class ::chromeos::AudioMixerAlsa; // http://crbug.com/125206
friend class ::chromeos::BlockingMethodCaller; // http://crbug.com/125360
friend class ::chromeos::system::StatisticsProviderImpl; // http://crbug.com/125385
- friend class browser_sync::NonFrontendDataTypeController; // http://crbug.com/19757
- friend class browser_sync::UIModelWorker; // http://crbug.com/19757
friend class chrome_browser_net::Predictor; // http://crbug.com/78451
friend class
content::BrowserGpuChannelHostFactory; // http://crbug.com/125248
friend class
content::BrowserGpuMemoryBufferManager; // http://crbug.com/420368
- friend class content::GLHelper; // http://crbug.com/125415
friend class content::GpuChannelHost; // http://crbug.com/125264
friend class content::TextInputClientMac; // http://crbug.com/121917
friend class dbus::Bus; // http://crbug.com/125222
friend class disk_cache::BackendImpl; // http://crbug.com/74623
friend class disk_cache::InFlightIO; // http://crbug.com/74623
- friend class media::AudioOutputController; // http://crbug.com/120973
- friend class net::FileStreamPosix; // http://crbug.com/115067
- friend class net::FileStreamWin; // http://crbug.com/115067
friend class net::internal::AddressTrackerLinux; // http://crbug.com/125097
- friend class ::AcceleratedPresenter; // http://crbug.com/125391
friend class ::BrowserProcessImpl; // http://crbug.com/125207
- friend class metrics::MetricsService; // http://crbug.com/124954
friend class ::NativeBackendKWallet; // http://crbug.com/125331
// END USAGE THAT NEEDS TO BE FIXED.
diff --git a/base/tuple_unittest.cc b/base/tuple_unittest.cc
index 402394c..8d620de 100644
--- a/base/tuple_unittest.cc
+++ b/base/tuple_unittest.cc
@@ -30,7 +30,8 @@
} // namespace
TEST(TupleTest, Basic) {
- Tuple0 t0 ALLOW_UNUSED = MakeTuple();
+ Tuple0 t0 = MakeTuple();
+ ALLOW_UNUSED_LOCAL(t0);
Tuple1<int> t1(1);
Tuple2<int, const char*> t2 = MakeTuple(1, static_cast<const char*>("wee"));
Tuple3<int, int, int> t3(1, 2, 3);
diff --git a/base/win/event_trace_consumer_unittest.cc b/base/win/event_trace_consumer_unittest.cc
index 92e91b9..3043152 100644
--- a/base/win/event_trace_consumer_unittest.cc
+++ b/base/win/event_trace_consumer_unittest.cc
@@ -14,7 +14,7 @@
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
-#include "base/process/process.h"
+#include "base/process/process_handle.h"
#include "base/strings/stringprintf.h"
#include "base/win/event_trace_controller.h"
#include "base/win/event_trace_provider.h"
@@ -79,8 +79,7 @@
class EtwTraceConsumerBaseTest: public testing::Test {
public:
EtwTraceConsumerBaseTest()
- : session_name_(StringPrintf(L"TestSession-%d",
- Process::Current().pid())) {
+ : session_name_(StringPrintf(L"TestSession-%d", GetCurrentProcId())) {
}
virtual void SetUp() {
diff --git a/base/win/event_trace_controller_unittest.cc b/base/win/event_trace_controller_unittest.cc
index 8ca9cf5..be11128 100644
--- a/base/win/event_trace_controller_unittest.cc
+++ b/base/win/event_trace_controller_unittest.cc
@@ -11,7 +11,7 @@
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
-#include "base/process/process.h"
+#include "base/process/process_handle.h"
#include "base/strings/stringprintf.h"
#include "base/sys_info.h"
#include "base/win/event_trace_controller.h"
@@ -110,8 +110,7 @@
class EtwTraceControllerTest : public testing::Test {
public:
EtwTraceControllerTest()
- : session_name_(
- StringPrintf(L"TestSession-%d", Process::Current().pid())) {
+ : session_name_(StringPrintf(L"TestSession-%d", GetCurrentProcId())) {
}
virtual void SetUp() {
diff --git a/base/win/registry.cc b/base/win/registry.cc
index e8fb892..23ad12c 100644
--- a/base/win/registry.cc
+++ b/base/win/registry.cc
@@ -34,23 +34,67 @@
} // namespace
-// RegKey ----------------------------------------------------------------------
+// Watches for modifications to a key.
+class RegKey::Watcher : public ObjectWatcher::Delegate {
+ public:
+ explicit Watcher(RegKey* owner) : owner_(owner) {}
+ ~Watcher() {}
-RegKey::RegKey()
- : key_(NULL),
- watch_event_(0),
- wow64access_(0) {
+ bool StartWatching(HKEY key, const ChangeCallback& callback);
+
+ // Implementation of ObjectWatcher::Delegate.
+ void OnObjectSignaled(HANDLE object) override {
+ DCHECK(watch_event_.IsValid() && watch_event_.Get() == object);
+ ChangeCallback callback = callback_;
+ callback_.Reset();
+ callback.Run();
+ }
+
+ private:
+ RegKey* owner_;
+ ScopedHandle watch_event_;
+ ObjectWatcher object_watcher_;
+ ChangeCallback callback_;
+ DISALLOW_COPY_AND_ASSIGN(Watcher);
+};
+
+bool RegKey::Watcher::StartWatching(HKEY key, const ChangeCallback& callback) {
+ DCHECK(key);
+ DCHECK(callback_.is_null());
+
+ if (!watch_event_.IsValid())
+ watch_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL));
+
+ if (!watch_event_.IsValid())
+ return false;
+
+ DWORD filter = REG_NOTIFY_CHANGE_NAME |
+ REG_NOTIFY_CHANGE_ATTRIBUTES |
+ REG_NOTIFY_CHANGE_LAST_SET |
+ REG_NOTIFY_CHANGE_SECURITY;
+
+ // Watch the registry key for a change of value.
+ LONG result = RegNotifyChangeKeyValue(key, TRUE, filter, watch_event_.Get(),
+ TRUE);
+ if (result != ERROR_SUCCESS) {
+ watch_event_.Close();
+ return false;
+ }
+
+ callback_ = callback;
+ return object_watcher_.StartWatching(watch_event_.Get(), this);
}
-RegKey::RegKey(HKEY key)
- : key_(key),
- watch_event_(0),
- wow64access_(0) {
+// RegKey ----------------------------------------------------------------------
+
+RegKey::RegKey() : key_(NULL), wow64access_(0) {
+}
+
+RegKey::RegKey(HKEY key) : key_(key), wow64access_(0) {
}
RegKey::RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access)
: key_(NULL),
- watch_event_(0),
wow64access_(0) {
if (rootkey) {
if (access & (KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_CREATE_LINK))
@@ -150,7 +194,6 @@
}
void RegKey::Close() {
- StopWatching();
if (key_) {
::RegCloseKey(key_);
key_ = NULL;
@@ -168,7 +211,6 @@
HKEY RegKey::Take() {
DCHECK(wow64access_ == 0);
- StopWatching();
HKEY key = key_;
key_ = NULL;
return key;
@@ -367,44 +409,14 @@
return result;
}
-LONG RegKey::StartWatching() {
- DCHECK(key_);
- if (!watch_event_)
- watch_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
+bool RegKey::StartWatching(const ChangeCallback& callback) {
+ if (!key_watcher_)
+ key_watcher_.reset(new Watcher(this));
- DWORD filter = REG_NOTIFY_CHANGE_NAME |
- REG_NOTIFY_CHANGE_ATTRIBUTES |
- REG_NOTIFY_CHANGE_LAST_SET |
- REG_NOTIFY_CHANGE_SECURITY;
+ if (!key_watcher_.get()->StartWatching(key_, callback))
+ return false;
- // Watch the registry key for a change of value.
- LONG result = RegNotifyChangeKeyValue(key_, TRUE, filter, watch_event_, TRUE);
- if (result != ERROR_SUCCESS) {
- CloseHandle(watch_event_);
- watch_event_ = 0;
- }
-
- return result;
-}
-
-bool RegKey::HasChanged() {
- if (watch_event_) {
- if (WaitForSingleObject(watch_event_, 0) == WAIT_OBJECT_0) {
- StartWatching();
- return true;
- }
- }
- return false;
-}
-
-LONG RegKey::StopWatching() {
- LONG result = ERROR_INVALID_HANDLE;
- if (watch_event_) {
- CloseHandle(watch_event_);
- watch_event_ = 0;
- result = ERROR_SUCCESS;
- }
- return result;
+ return true;
}
// static
diff --git a/base/win/registry.h b/base/win/registry.h
index e5524b8..c3e015b 100644
--- a/base/win/registry.h
+++ b/base/win/registry.h
@@ -12,6 +12,8 @@
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/stl_util.h"
+#include "base/win/object_watcher.h"
+#include "base/win/scoped_handle.h"
namespace base {
namespace win {
@@ -25,6 +27,9 @@
// are not touched in case of failure.
class BASE_EXPORT RegKey {
public:
+ // Called from the MessageLoop when the key changes.
+ typedef base::Callback<void()> ChangeCallback;
+
RegKey();
explicit RegKey(HKEY key);
RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access);
@@ -120,22 +125,16 @@
// Starts watching the key to see if any of its values have changed.
// The key must have been opened with the KEY_NOTIFY access privilege.
- LONG StartWatching();
+ // Returns true on success.
+ // To stop watching, delete this RegKey object. To continue watching the
+ // object after the callback is invoked, call StartWatching again.
+ bool StartWatching(const ChangeCallback& callback);
- // If StartWatching hasn't been called, always returns false.
- // Otherwise, returns true if anything under the key has changed.
- // This can't be const because the |watch_event_| may be refreshed.
- bool HasChanged();
-
- // Will automatically be called by destructor if not manually called
- // beforehand. Returns true if it was watching, false otherwise.
- LONG StopWatching();
-
- inline bool IsWatching() const { return watch_event_ != 0; }
- HANDLE watch_event() const { return watch_event_; }
HKEY Handle() const { return key_; }
private:
+ class Watcher;
+
// Calls RegDeleteKeyEx on supported platforms, alternatively falls back to
// RegDeleteKey.
static LONG RegDeleteKeyExWrapper(HKEY hKey,
@@ -147,9 +146,10 @@
static LONG RegDelRecurse(HKEY root_key,
const std::wstring& name,
REGSAM access);
+
HKEY key_; // The registry key being iterated.
- HANDLE watch_event_;
REGSAM wow64access_;
+ scoped_ptr<Watcher> key_watcher_;
DISALLOW_COPY_AND_ASSIGN(RegKey);
};
diff --git a/base/win/registry_unittest.cc b/base/win/registry_unittest.cc
index d2610ef..6548474 100644
--- a/base/win/registry_unittest.cc
+++ b/base/win/registry_unittest.cc
@@ -7,7 +7,10 @@
#include <cstring>
#include <vector>
+#include "base/bind.h"
#include "base/compiler_specific.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/win/windows_version.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -349,6 +352,68 @@
ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L"foo"));
}
+class TestChangeDelegate {
+ public:
+ TestChangeDelegate() : called_(false) {}
+ ~TestChangeDelegate() {}
+
+ void OnKeyChanged() {
+ MessageLoop::current()->QuitWhenIdle();
+ called_ = true;
+ }
+
+ bool WasCalled() {
+ bool was_called = called_;
+ called_ = false;
+ return was_called;
+ }
+
+ private:
+ bool called_;
+};
+
+TEST_F(RegistryTest, ChangeCallback) {
+ RegKey key;
+ TestChangeDelegate delegate;
+ MessageLoop message_loop;
+
+ std::wstring foo_key(kRootKey);
+ foo_key += L"\\Foo";
+ ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
+ KEY_READ));
+
+ ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
+ Unretained(&delegate))));
+ EXPECT_FALSE(delegate.WasCalled());
+
+ // Make some change.
+ RegKey key2;
+ ASSERT_EQ(ERROR_SUCCESS, key2.Open(HKEY_CURRENT_USER, foo_key.c_str(),
+ KEY_READ | KEY_SET_VALUE));
+ ASSERT_TRUE(key2.Valid());
+ EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name", L"data"));
+
+ // Allow delivery of the notification.
+ EXPECT_FALSE(delegate.WasCalled());
+ base::RunLoop().Run();
+
+ ASSERT_TRUE(delegate.WasCalled());
+ EXPECT_FALSE(delegate.WasCalled());
+
+ ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
+ Unretained(&delegate))));
+
+ // Change something else.
+ EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name2", L"data2"));
+ base::RunLoop().Run();
+ ASSERT_TRUE(delegate.WasCalled());
+
+ ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
+ Unretained(&delegate))));
+ base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(delegate.WasCalled());
+}
+
} // namespace
} // namespace win
diff --git a/build/android/pylib/device/commands/commands.gyp b/build/android/pylib/device/commands/commands.gyp
index d173e39..06d5c9c 100644
--- a/build/android/pylib/device/commands/commands.gyp
+++ b/build/android/pylib/device/commands/commands.gyp
@@ -8,6 +8,7 @@
'target_name': 'chromium_commands',
'type': 'none',
'variables': {
+ 'add_to_dependents_classpaths': 0,
'java_in_dir': ['java'],
},
'includes': [
diff --git a/build/common.gypi b/build/common.gypi
index 34000ed..e9e8a3e 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -1762,7 +1762,6 @@
# When building as part of the Android system, use system libraries
# where possible to reduce ROM size.
- 'use_system_icu%': '<(android_webview_build)',
'use_system_stlport%': '<(android_webview_build)',
# Copy it out one scope.
@@ -2562,9 +2561,6 @@
['use_cras==1', {
'defines': ['USE_CRAS=1'],
}],
- ['use_glib==1', {
- 'defines': ['USE_GLIB=1'],
- }],
['use_ozone==1', {
'defines': ['USE_OZONE=1'],
}],
@@ -2923,6 +2919,9 @@
'USE_OPENSSL_CERTS=1',
],
}],
+ ['<(use_glib)==1 and >(nacl_untrusted_build)==0', {
+ 'defines': ['USE_GLIB=1'],
+ }],
['<(use_nss)==1 and >(nacl_untrusted_build)==0', {
'defines': ['USE_NSS=1'],
}],
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 7994dd7..890d33e 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -71,6 +71,16 @@
# toolchains.
cros_use_custom_toolchain = false
}
+
+ # TODO(cjhopman): Make target_arch work for all platforms.
+
+ # Architecture of the target device. For Android builds, this will be equal to
+ # the cpu_arch of the default toolchain. When checking the CPU architecture
+ # for source files and build dependencies you should almost alway use cpu_arch
+ # instead. cpu_arch is the architecture of the current toolchain and allows
+ # cross-compiles (compiling the same target for multiple toolchains in the
+ # same build) to work.
+ target_arch = "arm"
}
# =============================================================================
@@ -174,6 +184,14 @@
}
}
+if (is_android) {
+ # TODO(cjhopman): enable this assert once bots are updated to not set
+ # cpu_arch.
+ #assert(cpu_arch == build_cpu_arch, "Android device target architecture should
+ # be set with 'target_arch', not 'cpu_arch'")
+ cpu_arch = target_arch
+}
+
# =============================================================================
# SOURCES FILTERS
# =============================================================================
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 344202c..af493bd 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -769,8 +769,26 @@
_native_libs = []
if (defined(invoker.native_libs)) {
+ _use_chromium_linker = false
+ if (defined(invoker.use_chromium_linker)) {
+ _use_chromium_linker = invoker.use_chromium_linker
+ }
+
+ # TODO(GYP) add "|| profiling_full_stack_frames
+ # Only enable the chromium linker on regular builds, since the
+ # component build crashes on Android 4.4. See b/11379966
+ if (is_component_build || cpu_arch == "arm64" || cpu_arch == "x64") {
+ _use_chromium_linker = false
+ }
+
_native_libs = invoker.native_libs
_native_libs_dir = base_path + "/libs"
+
+ if (_use_chromium_linker) {
+ _native_libs += [
+ "$root_build_dir/lib.stripped/libchromium_android_linker.so"
+ ]
+ }
}
_keystore_path = android_default_keystore_path
@@ -815,12 +833,14 @@
_srcjar_deps += [":${_template_name}__process_resources"]
if (_native_libs != []) {
- _use_chromium_linker = false
_enable_chromium_linker_tests = false
+ if (defined(invoker.enable_chromium_linker_tests)) {
+ _enable_chromium_linker_tests = invoker.enable_chromium_linker_tests
+ }
+
_load_library_from_apk = false
_native_lib_version_name = ""
-
java_cpp_template("${_template_name}__native_libraries_java") {
package_name = "org/chromium/base/library_loader"
sources = [
@@ -836,7 +856,7 @@
"NATIVE_LIBRARIES_VERSION_NUMBER=\"$_native_lib_version_name\"",
]
if (_use_chromium_linker) {
- defines += ["ENABLED_CHROMIUM_LINKER"]
+ defines += ["ENABLE_CHROMIUM_LINKER"]
}
if (_load_library_from_apk) {
defines += ["ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE"]
diff --git a/build/install-chroot.sh b/build/install-chroot.sh
index ae97d53..e2d558b 100755
--- a/build/install-chroot.sh
+++ b/build/install-chroot.sh
@@ -659,7 +659,7 @@
readlinepkg=$(sudo "/usr/local/bin/${target%bit}" sh -c \
'apt-cache search "lib64readline.\$" | sort | tail -n 1 | cut -d " " -f 1')
sudo "/usr/local/bin/${target%bit}" apt-get -y install \
- lib64expat1 lib64ncurses5 ${readlinepkg} lib64z1
+ lib64expat1 lib64ncurses5 ${readlinepkg} lib64z1 lib64stdc++6
dep=
for i in binutils gdb; do
[ -d /usr/share/doc/"$i" ] || dep="$dep $i"
diff --git a/build/java.gypi b/build/java.gypi
index bf6f56c..af0bf0e 100644
--- a/build/java.gypi
+++ b/build/java.gypi
@@ -19,6 +19,8 @@
# java_in_dir - The top-level java directory. The src should be in
# <java_in_dir>/src.
# Optional/automatic variables:
+# add_to_dependents_classpaths - Set to 0 if the resulting jar file should not
+# be added to its dependents' classpaths.
# additional_input_paths - These paths will be included in the 'inputs' list to
# ensure that this target is rebuilt when one of these paths changes.
# additional_src_dirs - Additional directories with .java files to be compiled
@@ -49,6 +51,7 @@
'<(DEPTH)/build/android/setup.gyp:build_output_dirs'
],
'variables': {
+ 'add_to_dependents_classpaths%': 1,
'android_jar': '<(android_sdk)/android.jar',
'input_jars_paths': [ '<(android_jar)' ],
'additional_src_dirs': [],
@@ -97,15 +100,17 @@
'emma_instrument': '<(emma_instrument)',
'javac_jar_path': '<(javac_jar_path)',
},
- # This all_dependent_settings is used for java targets only. This will add the
- # jar path to the classpath of dependent java targets.
- 'all_dependent_settings': {
- 'variables': {
- 'input_jars_paths': ['<(jar_final_path)'],
- 'library_dexed_jars_paths': ['<(dex_path)'],
- },
- },
'conditions': [
+ ['add_to_dependents_classpaths == 1', {
+ # This all_dependent_settings is used for java targets only. This will add the
+ # jar path to the classpath of dependent java targets.
+ 'all_dependent_settings': {
+ 'variables': {
+ 'input_jars_paths': ['<(jar_final_path)'],
+ 'library_dexed_jars_paths': ['<(dex_path)'],
+ },
+ },
+ }],
['has_java_resources == 1', {
'variables': {
'res_dir': '<(java_in_dir)/res',
diff --git a/build/mac/asan.gyp b/build/mac/asan.gyp
index fabe910..5231681 100644
--- a/build/mac/asan.gyp
+++ b/build/mac/asan.gyp
@@ -4,7 +4,7 @@
{
'targets': [
- {
+ {
'target_name': 'asan_dynamic_runtime',
'type': 'none',
'variables': {
@@ -48,6 +48,6 @@
],
}],
],
- },
- ],
+ },
+ ],
}
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc
index 5e4bc1e..e49cf1e 100644
--- a/cc/animation/animation.cc
+++ b/cc/animation/animation.cc
@@ -90,15 +90,14 @@
char name_buffer[256];
base::snprintf(name_buffer,
sizeof(name_buffer),
- "%s-%d%s",
+ "%s-%d",
s_targetPropertyNames[target_property_],
- group_,
- is_controlling_instance_ ? "(impl)" : "");
+ group_);
bool is_waiting_to_start = run_state_ == WaitingForTargetAvailability ||
run_state_ == Starting;
- if (is_waiting_to_start && run_state == Running) {
+ if (is_controlling_instance_ && is_waiting_to_start && run_state == Running) {
TRACE_EVENT_ASYNC_BEGIN1(
"cc", "Animation", this, "Name", TRACE_STR_COPY(name_buffer));
}
@@ -115,7 +114,7 @@
const char* new_run_state_name = s_runStateNames[run_state];
- if (!was_finished && is_finished())
+ if (is_controlling_instance_ && !was_finished && is_finished())
TRACE_EVENT_ASYNC_END0("cc", "Animation", this);
char state_buffer[256];
diff --git a/cc/debug/rasterize_and_record_benchmark.cc b/cc/debug/rasterize_and_record_benchmark.cc
index e83c118..7a1319d 100644
--- a/cc/debug/rasterize_and_record_benchmark.cc
+++ b/cc/debug/rasterize_and_record_benchmark.cc
@@ -26,7 +26,9 @@
const int kDefaultRecordRepeatCount = 100;
const char* kModeSuffixes[Picture::RECORDING_MODE_COUNT] = {
- "", "_sk_null_canvas", "_painting_disabled", "_skrecord"};
+ "",
+ "_sk_null_canvas",
+ "_painting_disabled"};
} // namespace
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 7573471..aee140f 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -129,7 +129,7 @@
layer_size,
visible_layer_rect,
update_source_frame_number_,
- RecordingMode(),
+ Picture::RECORD_NORMALLY,
rendering_stats_instrumentation());
last_updated_visible_content_rect_ = visible_content_rect();
@@ -148,17 +148,6 @@
pile_->set_is_mask(is_mask);
}
-Picture::RecordingMode PictureLayer::RecordingMode() const {
- switch (layer_tree_host()->settings().recording_mode) {
- case LayerTreeSettings::RecordNormally:
- return Picture::RECORD_NORMALLY;
- case LayerTreeSettings::RecordWithSkRecord:
- return Picture::RECORD_WITH_SKRECORD;
- }
- NOTREACHED();
- return Picture::RECORD_NORMALLY;
-}
-
bool PictureLayer::SupportsLCDText() const {
return true;
}
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h
index e0f6d15..2108fbe 100644
--- a/cc/layers/picture_layer.h
+++ b/cc/layers/picture_layer.h
@@ -40,8 +40,6 @@
ContentLayerClient* client() { return client_; }
- Picture::RecordingMode RecordingMode() const;
-
PicturePile* GetPicturePileForTesting() const { return pile_.get(); }
protected:
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc
index 0e3d8fa..545b332 100644
--- a/cc/layers/picture_layer_unittest.cc
+++ b/cc/layers/picture_layer_unittest.cc
@@ -84,22 +84,5 @@
EXPECT_FALSE(layer->IsSuitableForGpuRasterization());
}
-TEST(PictureLayerTest, RecordingModes) {
- MockContentLayerClient client;
- scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client);
-
- LayerTreeSettings settings;
- FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
- scoped_ptr<FakeLayerTreeHost> host =
- FakeLayerTreeHost::Create(&host_client, settings);
- host->SetRootLayer(layer);
- EXPECT_EQ(Picture::RECORD_NORMALLY, layer->RecordingMode());
-
- settings.recording_mode = LayerTreeSettings::RecordWithSkRecord;
- host = FakeLayerTreeHost::Create(&host_client, settings);
- host->SetRootLayer(layer);
- EXPECT_EQ(Picture::RECORD_WITH_SKRECORD, layer->RecordingMode());
-}
-
} // namespace
} // namespace cc
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index 308f084..1d09307 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -105,14 +105,17 @@
#define QUAD_DATA \
gfx::Rect quad_rect(30, 40, 50, 60); \
gfx::Rect quad_visible_rect(40, 50, 30, 20); \
- gfx::Rect ALLOW_UNUSED quad_opaque_rect(60, 55, 10, 10); \
- bool ALLOW_UNUSED needs_blending = true;
+ gfx::Rect quad_opaque_rect( 60, 55, 10, 10); \
+ ALLOW_UNUSED_LOCAL(quad_opaque_rect); \
+ bool needs_blending = true; \
+ ALLOW_UNUSED_LOCAL(needs_blending);
#define SETUP_AND_COPY_QUAD_NEW(Type, quad) \
DrawQuad* copy_new = \
render_pass->CopyFromAndAppendDrawQuad(quad_new, copy_shared_state); \
CompareDrawQuad(quad_new, copy_new, copy_shared_state); \
- const Type* ALLOW_UNUSED copy_quad = Type::MaterialCast(copy_new);
+ const Type* copy_quad = Type::MaterialCast(copy_new); \
+ ALLOW_UNUSED_LOCAL(copy_quad);
#define SETUP_AND_COPY_QUAD_ALL(Type, quad) \
DrawQuad* copy_all = \
@@ -124,7 +127,8 @@
DrawQuad* copy_new = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
quad_new, copy_shared_state, a); \
CompareDrawQuad(quad_new, copy_new, copy_shared_state); \
- const Type* ALLOW_UNUSED copy_quad = Type::MaterialCast(copy_new);
+ const Type* copy_quad = Type::MaterialCast(copy_new); \
+ ALLOW_UNUSED_LOCAL(copy_quad);
#define SETUP_AND_COPY_QUAD_ALL_RP(Type, quad, a) \
DrawQuad* copy_all = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc
index 6fa5abc..d9b10be 100644
--- a/cc/resources/picture.cc
+++ b/cc/resources/picture.cc
@@ -214,8 +214,6 @@
SkTileGridFactory factory(tile_grid_info);
SkPictureRecorder recorder;
- scoped_ptr<EXPERIMENTAL::SkRecording> recording;
-
skia::RefPtr<SkCanvas> canvas;
canvas = skia::SharePtr(recorder.beginRecording(
layer_rect_.width(), layer_rect_.height(), &factory));
@@ -238,11 +236,6 @@
canvas = skia::AdoptRef(SkCreateNullCanvas());
graphics_context_status = ContentLayerClient::GRAPHICS_CONTEXT_DISABLED;
break;
- case RECORD_WITH_SKRECORD:
- recording.reset(new EXPERIMENTAL::SkRecording(layer_rect_.width(),
- layer_rect_.height()));
- canvas = skia::SharePtr(recording->canvas());
- break;
default:
NOTREACHED();
}
@@ -263,13 +256,6 @@
picture_ = skia::AdoptRef(recorder.endRecording());
DCHECK(picture_);
- if (recording) {
- // SkRecording requires it's the only one holding onto canvas before we
- // may call releasePlayback(). (This helps enforce thread-safety.)
- canvas.clear();
- playback_.reset(recording->releasePlayback());
- }
-
EmitTraceSnapshot();
}
@@ -348,9 +334,7 @@
canvas->scale(contents_scale, contents_scale);
canvas->translate(layer_rect_.x(), layer_rect_.y());
- if (playback_) {
- playback_->draw(canvas);
- } else if (callback) {
+ if (callback) {
// If we have a callback, we need to call |draw()|, |drawPicture()| doesn't
// take a callback. This is used by |AnalysisCanvas| to early out.
picture_->draw(canvas, callback);
@@ -371,12 +355,7 @@
void Picture::Replay(SkCanvas* canvas) {
TRACE_EVENT_BEGIN0("cc", "Picture::Replay");
DCHECK(picture_);
-
- if (playback_) {
- playback_->draw(canvas);
- } else {
- picture_->draw(canvas);
- }
+ picture_->draw(canvas);
SkIRect bounds;
canvas->getClipDeviceBounds(&bounds);
TRACE_EVENT_END1("cc", "Picture::Replay",
@@ -385,21 +364,7 @@
scoped_ptr<base::Value> Picture::AsValue() const {
SkDynamicMemoryWStream stream;
-
- if (playback_) {
- // SkPlayback can't serialize itself, so re-record into an SkPicture.
- SkPictureRecorder recorder;
- skia::RefPtr<SkCanvas> canvas(skia::SharePtr(recorder.beginRecording(
- layer_rect_.width(),
- layer_rect_.height(),
- NULL))); // Default (no) bounding-box hierarchy is fastest.
- playback_->draw(canvas.get());
- skia::RefPtr<SkPicture> picture(skia::AdoptRef(recorder.endRecording()));
- picture->serialize(&stream, &EncodeBitmap);
- } else {
- // Serialize the picture.
- picture_->serialize(&stream, &EncodeBitmap);
- }
+ picture_->serialize(&stream, &EncodeBitmap);
// Encode the picture as base64.
scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
diff --git a/cc/resources/picture.h b/cc/resources/picture.h
index 69e3293..e0b6441 100644
--- a/cc/resources/picture.h
+++ b/cc/resources/picture.h
@@ -21,7 +21,6 @@
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkBBHFactory.h"
#include "third_party/skia/include/core/SkPicture.h"
-#include "third_party/skia/include/record/SkRecording.h"
#include "ui/gfx/rect.h"
class SkPixelRef;
@@ -49,7 +48,6 @@
RECORD_NORMALLY,
RECORD_WITH_SK_NULL_CANVAS,
RECORD_WITH_PAINTING_DISABLED,
- RECORD_WITH_SKRECORD,
RECORDING_MODE_COUNT, // Must be the last entry.
};
@@ -150,7 +148,6 @@
gfx::Rect layer_rect_;
skia::RefPtr<SkPicture> picture_;
- scoped_ptr<const EXPERIMENTAL::SkPlayback> playback_;
PixelRefMap pixel_refs_;
gfx::Point min_pixel_cell_;
diff --git a/cc/resources/picture_unittest.cc b/cc/resources/picture_unittest.cc
index fc25989..4abeceb 100644
--- a/cc/resources/picture_unittest.cc
+++ b/cc/resources/picture_unittest.cc
@@ -45,65 +45,56 @@
Picture::CreateFromValue(tmp.get());
EXPECT_FALSE(invalid_picture.get());
- Picture::RecordingMode kRecordingModes[] = {Picture::RECORD_NORMALLY,
- Picture::RECORD_WITH_SKRECORD};
-
// Single full-size rect picture.
content_layer_client.add_draw_rect(layer_rect, red_paint);
- for (size_t i = 0; i < arraysize(kRecordingModes); ++i) {
- scoped_refptr<Picture> one_rect_picture =
- Picture::Create(layer_rect,
- &content_layer_client,
- tile_grid_info,
- false,
- kRecordingModes[i]);
- scoped_ptr<base::Value> serialized_one_rect(one_rect_picture->AsValue());
+ scoped_refptr<Picture> one_rect_picture =
+ Picture::Create(layer_rect,
+ &content_layer_client,
+ tile_grid_info,
+ false,
+ Picture::RECORD_NORMALLY);
+ scoped_ptr<base::Value> serialized_one_rect(one_rect_picture->AsValue());
- // Reconstruct the picture.
- scoped_refptr<Picture> one_rect_picture_check =
- Picture::CreateFromValue(serialized_one_rect.get());
- EXPECT_TRUE(!!one_rect_picture_check.get());
+ // Reconstruct the picture.
+ scoped_refptr<Picture> one_rect_picture_check =
+ Picture::CreateFromValue(serialized_one_rect.get());
+ EXPECT_TRUE(!!one_rect_picture_check.get());
- // Check for equivalence.
- unsigned char one_rect_buffer[4 * 100 * 100] = {0};
- DrawPicture(one_rect_buffer, layer_rect, one_rect_picture);
- unsigned char one_rect_buffer_check[4 * 100 * 100] = {0};
- DrawPicture(one_rect_buffer_check, layer_rect, one_rect_picture_check);
+ // Check for equivalence.
+ unsigned char one_rect_buffer[4 * 100 * 100] = {0};
+ DrawPicture(one_rect_buffer, layer_rect, one_rect_picture);
+ unsigned char one_rect_buffer_check[4 * 100 * 100] = {0};
+ DrawPicture(one_rect_buffer_check, layer_rect, one_rect_picture_check);
- EXPECT_EQ(one_rect_picture->LayerRect(),
- one_rect_picture_check->LayerRect());
- EXPECT_EQ(0, memcmp(one_rect_buffer, one_rect_buffer_check, 4 * 100 * 100));
- }
+ EXPECT_EQ(one_rect_picture->LayerRect(), one_rect_picture_check->LayerRect());
+ EXPECT_EQ(0, memcmp(one_rect_buffer, one_rect_buffer_check, 4 * 100 * 100));
// Two rect picture.
content_layer_client.add_draw_rect(gfx::Rect(25, 25, 50, 50), green_paint);
- for (size_t i = 0; i < arraysize(kRecordingModes); ++i) {
- scoped_refptr<Picture> two_rect_picture =
- Picture::Create(layer_rect,
- &content_layer_client,
- tile_grid_info,
- false,
- Picture::RECORD_NORMALLY);
+ scoped_refptr<Picture> two_rect_picture =
+ Picture::Create(layer_rect,
+ &content_layer_client,
+ tile_grid_info,
+ false,
+ Picture::RECORD_NORMALLY);
- scoped_ptr<base::Value> serialized_two_rect(two_rect_picture->AsValue());
+ scoped_ptr<base::Value> serialized_two_rect(two_rect_picture->AsValue());
- // Reconstruct the picture.
- scoped_refptr<Picture> two_rect_picture_check =
- Picture::CreateFromValue(serialized_two_rect.get());
- EXPECT_TRUE(!!two_rect_picture_check.get());
+ // Reconstruct the picture.
+ scoped_refptr<Picture> two_rect_picture_check =
+ Picture::CreateFromValue(serialized_two_rect.get());
+ EXPECT_TRUE(!!two_rect_picture_check.get());
- // Check for equivalence.
- unsigned char two_rect_buffer[4 * 100 * 100] = {0};
- DrawPicture(two_rect_buffer, layer_rect, two_rect_picture);
- unsigned char two_rect_buffer_check[4 * 100 * 100] = {0};
- DrawPicture(two_rect_buffer_check, layer_rect, two_rect_picture_check);
+ // Check for equivalence.
+ unsigned char two_rect_buffer[4 * 100 * 100] = {0};
+ DrawPicture(two_rect_buffer, layer_rect, two_rect_picture);
+ unsigned char two_rect_buffer_check[4 * 100 * 100] = {0};
+ DrawPicture(two_rect_buffer_check, layer_rect, two_rect_picture_check);
- EXPECT_EQ(two_rect_picture->LayerRect(),
- two_rect_picture_check->LayerRect());
- EXPECT_EQ(0, memcmp(two_rect_buffer, two_rect_buffer_check, 4 * 100 * 100));
- }
+ EXPECT_EQ(two_rect_picture->LayerRect(), two_rect_picture_check->LayerRect());
+ EXPECT_EQ(0, memcmp(two_rect_buffer, two_rect_buffer_check, 4 * 100 * 100));
}
TEST(PictureTest, PixelRefIterator) {
@@ -479,15 +470,7 @@
content_layer_client.last_context_status());
EXPECT_TRUE(picture.get());
- picture = Picture::Create(layer_rect,
- &content_layer_client,
- tile_grid_info,
- false,
- Picture::RECORD_WITH_SKRECORD);
- EXPECT_TRUE(content_layer_client.last_canvas() != NULL);
- EXPECT_TRUE(picture.get());
-
- EXPECT_EQ(4, Picture::RECORDING_MODE_COUNT);
+ EXPECT_EQ(3, Picture::RECORDING_MODE_COUNT);
}
} // namespace
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 6e2fcec..f839439 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -30,7 +30,6 @@
should_clear_root_render_pass(true),
gpu_rasterization_enabled(false),
gpu_rasterization_forced(false),
- recording_mode(RecordNormally),
create_low_res_tiling(false),
scrollbar_animator(NoAnimator),
scrollbar_fade_delay_ms(0),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 6646120..71cb253 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -35,11 +35,6 @@
bool should_clear_root_render_pass;
bool gpu_rasterization_enabled;
bool gpu_rasterization_forced;
- enum RecordingMode {
- RecordNormally,
- RecordWithSkRecord,
- };
- RecordingMode recording_mode;
bool create_low_res_tiling;
enum ScrollbarAnimator {
diff --git a/crypto/hmac_unittest.cc b/crypto/hmac_unittest.cc
index 174c323..91eccd6 100644
--- a/crypto/hmac_unittest.cc
+++ b/crypto/hmac_unittest.cc
@@ -142,7 +142,7 @@
"\xBB\xFF\x1A\x91" }
};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
+ for (size_t i = 0; i < arraysize(cases); ++i) {
crypto::HMAC hmac(crypto::HMAC::SHA1);
ASSERT_TRUE(hmac.Init(reinterpret_cast<const unsigned char*>(cases[i].key),
cases[i].key_len));
@@ -239,7 +239,7 @@
ASSERT_TRUE(
hmac.Init(reinterpret_cast<const unsigned char*>(kSimpleKey),
kSimpleKeyLength));
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kSimpleHmacCases); ++i) {
+ for (size_t i = 0; i < arraysize(kSimpleHmacCases); ++i) {
std::string data_string(kSimpleHmacCases[i].data,
kSimpleHmacCases[i].data_len);
unsigned char digest[kSHA1DigestSize];
@@ -254,7 +254,7 @@
hmac.Init(reinterpret_cast<const unsigned char*>(kSimpleKey),
kSimpleKeyLength));
const char empty_digest[kSHA1DigestSize] = { 0 };
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kSimpleHmacCases); ++i) {
+ for (size_t i = 0; i < arraysize(kSimpleHmacCases); ++i) {
// Expected results
EXPECT_TRUE(hmac.Verify(
base::StringPiece(kSimpleHmacCases[i].data,
diff --git a/gin/converter_unittest.cc b/gin/converter_unittest.cc
index 791d7e6..f8011d6 100644
--- a/gin/converter_unittest.cc
+++ b/gin/converter_unittest.cc
@@ -55,7 +55,7 @@
{ Undefined(instance_->isolate()).As<Value>(), false },
};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
+ for (size_t i = 0; i < arraysize(test_data); ++i) {
bool result = false;
EXPECT_TRUE(Converter<bool>::FromV8(instance_->isolate(),
test_data[i].input, &result));
@@ -72,7 +72,7 @@
HandleScope handle_scope(instance_->isolate());
int test_data_to[] = {-1, 0, 1};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data_to); ++i) {
+ for (size_t i = 0; i < arraysize(test_data_to); ++i) {
EXPECT_TRUE(Converter<int32_t>::ToV8(instance_->isolate(), test_data_to[i])
->StrictEquals(
Integer::New(instance_->isolate(), test_data_to[i])));
@@ -98,7 +98,7 @@
{ v8::Undefined(instance_->isolate()).As<Value>(), false, 0 },
};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data_from); ++i) {
+ for (size_t i = 0; i < arraysize(test_data_from); ++i) {
int32_t result = std::numeric_limits<int32_t>::min();
bool success = Converter<int32_t>::FromV8(instance_->isolate(),
test_data_from[i].input, &result);
diff --git a/gpu/command_buffer/client/query_tracker.cc b/gpu/command_buffer/client/query_tracker.cc
index c12d975..e215c16 100644
--- a/gpu/command_buffer/client/query_tracker.cc
+++ b/gpu/command_buffer/client/query_tracker.cc
@@ -9,6 +9,7 @@
#include <GLES2/gl2extchromium.h>
#include "base/atomicops.h"
+#include "base/numerics/safe_conversions.h"
#include "gpu/command_buffer/client/gles2_cmd_helper.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/client/mapped_memory.h"
@@ -153,19 +154,18 @@
helper->IsContextLost()) {
switch (target()) {
case GL_COMMANDS_ISSUED_CHROMIUM:
- result_ = std::min(info_.sync->result,
- static_cast<uint64>(0xFFFFFFFFL));
+ result_ = base::saturated_cast<uint32>(info_.sync->result);
break;
case GL_LATENCY_QUERY_CHROMIUM:
// Disabled DCHECK because of http://crbug.com/419236.
//DCHECK(info_.sync->result >= client_begin_time_us_);
- result_ = std::min(info_.sync->result - client_begin_time_us_,
- static_cast<uint64>(0xFFFFFFFFL));
+ result_ = base::saturated_cast<uint32>(
+ info_.sync->result - client_begin_time_us_);
break;
case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM:
case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM:
default:
- result_ = info_.sync->result;
+ result_ = static_cast<uint32>(info_.sync->result);
break;
}
state_ = kComplete;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index f52c10e..6253cc8 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1202,6 +1202,11 @@
// location is not -1.
bool CheckCurrentProgramForUniform(GLint location, const char* function_name);
+ // Checks if the current program samples a texture that is also the color
+ // image of the current bound framebuffer, i.e., the source and destination
+ // of the draw operation are the same.
+ bool CheckDrawingFeedbackLoops();
+
// Gets the type of a uniform for a location in the current program. Sets GL
// errors if the current program is not valid. Returns true if the current
// program is valid and the location exists. Adjusts count so it
@@ -2365,7 +2370,7 @@
DCHECK(context->IsCurrent(surface.get()));
DCHECK(!context_.get());
- surfaceless_ = surface->IsSurfaceless();
+ surfaceless_ = surface->IsSurfaceless() && !offscreen;
set_initialized();
gpu_tracer_.reset(new GPUTracer(this));
@@ -3123,7 +3128,7 @@
return false;
if (backbuffer_needs_clear_bits_) {
glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat(
- offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1);
+ offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1.f);
state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glClearStencil(0);
state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
@@ -3687,7 +3692,7 @@
{
ScopedFrameBufferBinder binder(this, offscreen_target_frame_buffer_->id());
glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat(
- offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1);
+ offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1.f);
state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glClearStencil(0);
state_.SetDeviceStencilMaskSeparate(GL_FRONT, kDefaultStencilMask);
@@ -5750,6 +5755,38 @@
return location != -1;
}
+bool GLES2DecoderImpl::CheckDrawingFeedbackLoops() {
+ Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER);
+ if (!framebuffer)
+ return false;
+ const Framebuffer::Attachment* attachment =
+ framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0);
+ if (!attachment)
+ return false;
+
+ DCHECK(state_.current_program.get());
+ const Program::SamplerIndices& sampler_indices =
+ state_.current_program->sampler_indices();
+ for (size_t ii = 0; ii < sampler_indices.size(); ++ii) {
+ const Program::UniformInfo* uniform_info =
+ state_.current_program->GetUniformInfo(sampler_indices[ii]);
+ DCHECK(uniform_info);
+ if (uniform_info->type != GL_SAMPLER_2D)
+ continue;
+ for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) {
+ GLuint texture_unit_index = uniform_info->texture_units[jj];
+ if (texture_unit_index >= state_.texture_units.size())
+ continue;
+ TextureUnit& texture_unit = state_.texture_units[texture_unit_index];
+ TextureRef* texture_ref =
+ texture_unit.GetInfoForSamplerType(GL_SAMPLER_2D).get();
+ if (attachment->IsTexture(texture_ref))
+ return true;
+ }
+ }
+ return false;
+}
+
bool GLES2DecoderImpl::PrepForSetUniformByLocation(
GLint fake_location,
const char* function_name,
@@ -6246,6 +6283,13 @@
return false;
}
+ if (CheckDrawingFeedbackLoops()) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name,
+ "Source and destination textures of the draw are the same.");
+ return false;
+ }
+
return state_.vertex_attrib_manager
->ValidateBindings(function_name,
this,
@@ -7210,7 +7254,7 @@
GLuint indx = c.indx;
GLint size = c.size;
GLenum type = c.type;
- GLboolean normalized = c.normalized;
+ GLboolean normalized = static_cast<GLboolean>(c.normalized);
GLsizei stride = c.stride;
GLsizei offset = c.offset;
const void* ptr = reinterpret_cast<const void*>(offset);
@@ -7452,7 +7496,7 @@
GLsizei height = c.height;
GLenum format = c.format;
GLenum type = c.type;
- GLboolean async = c.async;
+ GLboolean async = static_cast<GLboolean>(c.async);
if (width < 0 || height < 0) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0");
return error::kNoError;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
index 7c8e5ae..4ee12ff 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc
@@ -314,7 +314,12 @@
const GLsizei kWidth = 1;
const GLsizei kHeight = 1;
const GLenum kFormat = GL_RGB;
- DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
+ // Use a different texture for framebuffer to avoid drawing feedback loops.
+ EXPECT_CALL(*gl_, GenTextures(_, _))
+ .WillOnce(SetArgumentPointee<1>(kNewServiceId))
+ .RetiresOnSaturation();
+ GenHelper<cmds::GenTexturesImmediate>(kNewClientId);
+ DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId);
// Pass some data so the texture will be marked as cleared.
DoTexImage2D(GL_TEXTURE_2D,
0,
@@ -331,10 +336,11 @@
DoFramebufferTexture2D(GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
- client_texture_id_,
- kServiceTextureId,
+ kNewClientId,
+ kNewServiceId,
0,
GL_NO_ERROR);
+ DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId);
EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
.WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
.RetiresOnSaturation();
diff --git a/gpu/command_buffer/service/program_cache.cc b/gpu/command_buffer/service/program_cache.cc
index ad395c7..abdcfc0 100644
--- a/gpu/command_buffer/service/program_cache.cc
+++ b/gpu/command_buffer/service/program_cache.cc
@@ -123,9 +123,9 @@
current_pos += name_size;
const GLint value = it->second;
buffer[current_pos++] = value >> 24;
- buffer[current_pos++] = value >> 16;
- buffer[current_pos++] = value >> 8;
- buffer[current_pos++] = value;
+ buffer[current_pos++] = static_cast<unsigned char>(value >> 16);
+ buffer[current_pos++] = static_cast<unsigned char>(value >> 8);
+ buffer[current_pos++] = static_cast<unsigned char>(value);
}
}
base::SHA1HashBytes(buffer.get(),
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc
index e8196f6..63a64b7 100644
--- a/gpu/command_buffer/service/program_manager.cc
+++ b/gpu/command_buffer/service/program_manager.cc
@@ -591,16 +591,20 @@
}
UMA_HISTOGRAM_CUSTOM_COUNTS(
"GPU.ProgramCache.BinaryCacheMissTime",
- (TimeTicks::HighResNow() - before_time).InMicroseconds(),
+ static_cast<base::HistogramBase::Sample>(
+ (TimeTicks::HighResNow() - before_time).InMicroseconds()),
0,
- TimeDelta::FromSeconds(10).InMicroseconds(),
+ static_cast<base::HistogramBase::Sample>(
+ TimeDelta::FromSeconds(10).InMicroseconds()),
50);
} else {
UMA_HISTOGRAM_CUSTOM_COUNTS(
"GPU.ProgramCache.BinaryCacheHitTime",
- (TimeTicks::HighResNow() - before_time).InMicroseconds(),
+ static_cast<base::HistogramBase::Sample>(
+ (TimeTicks::HighResNow() - before_time).InMicroseconds()),
0,
- TimeDelta::FromSeconds(1).InMicroseconds(),
+ static_cast<base::HistogramBase::Sample>(
+ TimeDelta::FromSeconds(1).InMicroseconds()),
50);
}
} else {
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index 45aaa65..4dbf528 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -1293,7 +1293,7 @@
if (result != GL_NO_ERROR) {
if (result == GL_INVALID_ENUM) {
ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
- error_state, function_name, param, "param");
+ error_state, function_name, pname, "pname");
} else {
ERRORSTATE_SET_GL_ERROR_INVALID_PARAMF(
error_state, result, function_name, pname, param);
diff --git a/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc b/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
index 444f714..44d0840 100644
--- a/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
+++ b/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc
@@ -45,8 +45,8 @@
new SharedMemoryBufferBacking(shm.Pass(), kBufferSize));
SharedMemoryBufferBacking* backing_raw_ptr = backing.get();
- EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
- 1, backing.PassAs<BufferBacking>()));
+ EXPECT_TRUE(
+ transfer_buffer_manager_->RegisterTransferBuffer(1, backing.Pass()));
scoped_refptr<Buffer> registered =
transfer_buffer_manager_->GetTransferBuffer(1);
diff --git a/gpu/config/gpu_info_collector_win.cc b/gpu/config/gpu_info_collector_win.cc
index 244fd53..53343f6 100644
--- a/gpu/config/gpu_info_collector_win.cc
+++ b/gpu/config/gpu_info_collector_win.cc
@@ -154,12 +154,17 @@
UMA_HISTOGRAM_TIMES("GPU.WinSAT.ReadResultsFileTime",
base::TimeTicks::Now() - start_time);
- UMA_HISTOGRAM_CUSTOM_COUNTS("GPU.WinSAT.OverallScore2",
- stats.overall * 10, 10, 200, 50);
- UMA_HISTOGRAM_CUSTOM_COUNTS("GPU.WinSAT.GraphicsScore2",
- stats.graphics * 10, 10, 200, 50);
- UMA_HISTOGRAM_CUSTOM_COUNTS("GPU.WinSAT.GamingScore2",
- stats.gaming * 10, 10, 200, 50);
+ UMA_HISTOGRAM_CUSTOM_COUNTS(
+ "GPU.WinSAT.OverallScore2",
+ static_cast<base::HistogramBase::Sample>(stats.overall * 10), 10, 200,
+ 50);
+ UMA_HISTOGRAM_CUSTOM_COUNTS(
+ "GPU.WinSAT.GraphicsScore2",
+ static_cast<base::HistogramBase::Sample>(stats.graphics * 10), 10, 200,
+ 50);
+ UMA_HISTOGRAM_CUSTOM_COUNTS(
+ "GPU.WinSAT.GamingScore2",
+ static_cast<base::HistogramBase::Sample>(stats.gaming * 10), 10, 200, 50);
UMA_HISTOGRAM_BOOLEAN(
"GPU.WinSAT.HasResults",
stats.overall != 0.0 && stats.graphics != 0.0 && stats.gaming != 0.0);
diff --git a/mojo/android/BUILD.gn b/mojo/android/BUILD.gn
index 5eb9ded..8fb6259 100644
--- a/mojo/android/BUILD.gn
+++ b/mojo/android/BUILD.gn
@@ -20,7 +20,7 @@
jni_package = "mojo"
}
-shared_library("libsystem_java") {
+source_set("libsystem_java") {
sources = [
"system/core_impl.cc",
"system/core_impl.h",
diff --git a/mojo/application_manager/application_manager_unittest.cc b/mojo/application_manager/application_manager_unittest.cc
index 5763265..1800dce 100644
--- a/mojo/application_manager/application_manager_unittest.cc
+++ b/mojo/application_manager/application_manager_unittest.cc
@@ -108,9 +108,7 @@
void set_context(TestContext* context) { context_ = context; }
int num_loads() const { return num_loads_; }
- std::vector<std::string> GetArgs() {
- return test_app_->args().To<std::vector<std::string> >();
- }
+ const std::vector<std::string>& GetArgs() const { return test_app_->args(); }
private:
// ApplicationLoader implementation.
@@ -445,8 +443,7 @@
}
void AddLoaderForURL(const GURL& url, const std::string& requestor_url) {
- application_manager_->SetLoaderForURL(
- MakeLoader(requestor_url).PassAs<ApplicationLoader>(), url);
+ application_manager_->SetLoaderForURL(MakeLoader(requestor_url), url);
}
bool HasFactoryForTestURL() {
diff --git a/mojo/common/message_pump_mojo.cc b/mojo/common/message_pump_mojo.cc
index 6d21af2..c069270 100644
--- a/mojo/common/message_pump_mojo.cc
+++ b/mojo/common/message_pump_mojo.cc
@@ -97,6 +97,14 @@
handlers_.erase(handle);
}
+void MessagePumpMojo::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void MessagePumpMojo::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
void MessagePumpMojo::Run(Delegate* delegate) {
RunState run_state;
// TODO: better deal with error handling.
@@ -175,8 +183,10 @@
} else if (result > 0) {
const size_t index = static_cast<size_t>(result);
DCHECK(handlers_.find(wait_state.handles[index]) != handlers_.end());
+ WillSignalHandler();
handlers_[wait_state.handles[index]].handler->OnHandleReady(
wait_state.handles[index]);
+ DidSignalHandler();
} else {
switch (result) {
case MOJO_RESULT_CANCELLED:
@@ -204,7 +214,9 @@
if (!i->second.deadline.is_null() && i->second.deadline < now &&
handlers_.find(i->first) != handlers_.end() &&
handlers_[i->first].id == i->second.id) {
+ WillSignalHandler();
i->second.handler->OnHandleError(i->first, MOJO_RESULT_DEADLINE_EXCEEDED);
+ DidSignalHandler();
handlers_.erase(i->first);
did_work = true;
}
@@ -232,7 +244,9 @@
MessagePumpMojoHandler* handler =
handlers_[wait_state.handles[i]].handler;
handlers_.erase(wait_state.handles[i]);
+ WillSignalHandler();
handler->OnHandleError(wait_state.handles[i], result);
+ DidSignalHandler();
return;
}
}
@@ -274,5 +288,13 @@
return deadline;
}
+void MessagePumpMojo::WillSignalHandler() {
+ FOR_EACH_OBSERVER(Observer, observers_, WillSignalHandler());
+}
+
+void MessagePumpMojo::DidSignalHandler() {
+ FOR_EACH_OBSERVER(Observer, observers_, DidSignalHandler());
+}
+
} // namespace common
} // namespace mojo
diff --git a/mojo/common/message_pump_mojo.h b/mojo/common/message_pump_mojo.h
index 26e28b1..4dd7155 100644
--- a/mojo/common/message_pump_mojo.h
+++ b/mojo/common/message_pump_mojo.h
@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_pump.h"
+#include "base/observer_list.h"
#include "base/synchronization/lock.h"
#include "base/time/time.h"
#include "mojo/common/mojo_common_export.h"
@@ -23,6 +24,17 @@
// Mojo implementation of MessagePump.
class MOJO_COMMON_EXPORT MessagePumpMojo : public base::MessagePump {
public:
+ class Observer {
+ public:
+ Observer() {}
+
+ virtual void WillSignalHandler() = 0;
+ virtual void DidSignalHandler() = 0;
+
+ protected:
+ virtual ~Observer() {}
+ };
+
MessagePumpMojo();
virtual ~MessagePumpMojo();
@@ -45,6 +57,9 @@
void RemoveHandler(const Handle& handle);
+ void AddObserver(Observer*);
+ void RemoveObserver(Observer*);
+
// MessagePump:
virtual void Run(Delegate* delegate) override;
virtual void Quit() override;
@@ -88,6 +103,9 @@
// Returns the deadline for the call to MojoWaitMany().
MojoDeadline GetDeadlineForWait(const RunState& run_state) const;
+ void WillSignalHandler();
+ void DidSignalHandler();
+
// If non-NULL we're running (inside Run()). Member is reference to value on
// stack.
RunState* run_state_;
@@ -106,6 +124,8 @@
// notify it.
int next_handler_id_;
+ ObserverList<Observer> observers_;
+
DISALLOW_COPY_AND_ASSIGN(MessagePumpMojo);
};
diff --git a/mojo/common/message_pump_mojo_unittest.cc b/mojo/common/message_pump_mojo_unittest.cc
index d552942..f340132 100644
--- a/mojo/common/message_pump_mojo_unittest.cc
+++ b/mojo/common/message_pump_mojo_unittest.cc
@@ -47,6 +47,19 @@
DISALLOW_COPY_AND_ASSIGN(CountingMojoHandler);
};
+class CountingObserver : public MessagePumpMojo::Observer {
+ public:
+ virtual void WillSignalHandler() override {
+ will_signal_handler_count++;
+ }
+ virtual void DidSignalHandler() override {
+ did_signal_handler_count++;
+ }
+
+ int will_signal_handler_count = 0;
+ int did_signal_handler_count = 0;
+};
+
TEST(MessagePumpMojo, RunUntilIdle) {
base::MessageLoop message_loop(MessagePumpMojo::Create());
CountingMojoHandler handler;
@@ -64,6 +77,36 @@
EXPECT_EQ(2, handler.success_count());
}
+TEST(MessagePumpMojo, Observer) {
+ base::MessageLoop message_loop(MessagePumpMojo::Create());
+
+ CountingObserver observer;
+ MessagePumpMojo::current()->AddObserver(&observer);
+
+ CountingMojoHandler handler;
+ MessagePipe handles;
+ MessagePumpMojo::current()->AddHandler(&handler,
+ handles.handle0.get(),
+ MOJO_HANDLE_SIGNAL_READABLE,
+ base::TimeTicks());
+ WriteMessageRaw(
+ handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
+ base::RunLoop run_loop;
+ run_loop.RunUntilIdle();
+ EXPECT_EQ(1, handler.success_count());
+ EXPECT_EQ(1, observer.will_signal_handler_count);
+ EXPECT_EQ(1, observer.did_signal_handler_count);
+ MessagePumpMojo::current()->RemoveObserver(&observer);
+
+ WriteMessageRaw(
+ handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
+ base::RunLoop run_loop2;
+ run_loop2.RunUntilIdle();
+ EXPECT_EQ(2, handler.success_count());
+ EXPECT_EQ(1, observer.will_signal_handler_count);
+ EXPECT_EQ(1, observer.did_signal_handler_count);
+}
+
TEST(MessagePumpMojo, UnregisterAfterDeadline) {
base::MessageLoop message_loop(MessagePumpMojo::Create());
CountingMojoHandler handler;
diff --git a/mojo/converters/input_events/input_events_type_converters.cc b/mojo/converters/input_events/input_events_type_converters.cc
index f0cd627..58ee75a 100644
--- a/mojo/converters/input_events/input_events_type_converters.cc
+++ b/mojo/converters/input_events/input_events_type_converters.cc
@@ -192,7 +192,7 @@
input->key_data->text,
input->key_data->unmodified_text)));
key_event->set_platform_keycode(input->key_data->native_key_code);
- ui_event = key_event.PassAs<ui::KeyEvent>();
+ ui_event = key_event.Pass();
break;
}
case EVENT_TYPE_MOUSE_PRESSED:
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
index 0582b23..f008bec 100644
--- a/mojo/edk/system/channel.cc
+++ b/mojo/edk/system/channel.cc
@@ -12,7 +12,6 @@
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/system/message_pipe_endpoint.h"
#include "mojo/edk/system/transport_data.h"
namespace mojo {
@@ -125,8 +124,9 @@
endpoint->Run(remote_id);
}
-void Channel::AttachAndRunEndpoint(scoped_refptr<ChannelEndpoint> endpoint,
- bool is_bootstrap) {
+ChannelEndpointId Channel::AttachAndRunEndpoint(
+ scoped_refptr<ChannelEndpoint> endpoint,
+ bool is_bootstrap) {
DCHECK(endpoint.get());
ChannelEndpointId local_id;
@@ -144,8 +144,6 @@
remote_id = ChannelEndpointId::GetBootstrap();
} else {
- // TODO(vtl): More work needs to be done to enable the non-bootstrap case.
- NOTREACHED() << "Non-bootstrap case not yet fully implemented";
do {
local_id = local_id_generator_.GetNext();
} while (local_id_to_endpoint_map_.find(local_id) !=
@@ -158,29 +156,22 @@
local_id_to_endpoint_map_[local_id] = endpoint;
}
+ if (!is_bootstrap) {
+ if (!SendControlMessage(
+ MessageInTransit::kSubtypeChannelAttachAndRunEndpoint,
+ local_id,
+ remote_id)) {
+ HandleLocalError(base::StringPrintf(
+ "Failed to send message to run remote message pipe endpoint (local "
+ "ID %u, remote ID %u)",
+ static_cast<unsigned>(local_id.value()),
+ static_cast<unsigned>(remote_id.value())));
+ // TODO(vtl): Should we continue on to |AttachAndRun()|?
+ }
+ }
+
endpoint->AttachAndRun(this, local_id, remote_id);
-}
-
-void Channel::RunRemoteMessagePipeEndpoint(ChannelEndpointId local_id,
- ChannelEndpointId remote_id) {
-#if DCHECK_IS_ON
- {
- base::AutoLock locker(lock_);
- DCHECK(local_id_to_endpoint_map_.find(local_id) !=
- local_id_to_endpoint_map_.end());
- }
-#endif
-
- if (!SendControlMessage(
- MessageInTransit::kSubtypeChannelRunMessagePipeEndpoint,
- local_id,
- remote_id)) {
- HandleLocalError(base::StringPrintf(
- "Failed to send message to run remote message pipe endpoint (local ID "
- "%u, remote ID %u)",
- static_cast<unsigned>(local_id.value()),
- static_cast<unsigned>(remote_id.value())));
- }
+ return remote_id;
}
bool Channel::WriteMessage(scoped_ptr<MessageInTransit> message) {
@@ -243,6 +234,25 @@
}
}
+scoped_refptr<MessagePipe> Channel::PassIncomingMessagePipe(
+ ChannelEndpointId local_id) {
+ // No need to check the validity of |local_id| -- if it's not valid, it simply
+ // won't be in |incoming_message_pipes_|.
+ DVLOG_IF(2, !local_id.is_valid() || !local_id.is_remote())
+ << "Attempt to get invalid incoming message pipe for ID " << local_id;
+
+ base::AutoLock locker(lock_);
+
+ auto it = incoming_message_pipes_.find(local_id);
+ if (it == incoming_message_pipes_.end())
+ return scoped_refptr<MessagePipe>();
+
+ scoped_refptr<MessagePipe> rv;
+ rv.swap(it->second);
+ incoming_message_pipes_.erase(it);
+ return rv;
+}
+
size_t Channel::GetSerializedPlatformHandleSize() const {
return raw_channel_->GetSerializedPlatformHandleSize();
}
@@ -375,14 +385,14 @@
}
switch (message_view.subtype()) {
- case MessageInTransit::kSubtypeChannelRunMessagePipeEndpoint:
- DVLOG(2) << "Handling channel message to run message pipe (local ID "
- << message_view.destination_id() << ", remote ID "
- << message_view.source_id() << ")";
- if (!OnRunMessagePipeEndpoint(message_view.destination_id(),
- message_view.source_id())) {
+ case MessageInTransit::kSubtypeChannelAttachAndRunEndpoint:
+ DVLOG(2) << "Handling channel message to attach and run message pipe "
+ "(local ID " << message_view.destination_id()
+ << ", remote ID " << message_view.source_id() << ")";
+ if (!OnAttachAndRunEndpoint(message_view.destination_id(),
+ message_view.source_id())) {
HandleRemoteError(
- "Received invalid channel message to run message pipe");
+ "Received invalid channel message to attach and run message pipe");
}
break;
case MessageInTransit::kSubtypeChannelRemoveMessagePipeEndpoint:
@@ -411,20 +421,51 @@
}
}
-bool Channel::OnRunMessagePipeEndpoint(ChannelEndpointId local_id,
- ChannelEndpointId remote_id) {
+bool Channel::OnAttachAndRunEndpoint(ChannelEndpointId local_id,
+ ChannelEndpointId remote_id) {
+ // We should only get this for remotely-created local endpoints, so our local
+ // ID should be "remote".
+ if (!local_id.is_valid() || !local_id.is_remote()) {
+ DVLOG(2) << "Received attach and run endpoint with invalid local ID";
+ return false;
+ }
+
+ // Conversely, the remote end should be "local".
+ if (!remote_id.is_valid() || remote_id.is_remote()) {
+ DVLOG(2) << "Received attach and run endpoint with invalid remote ID";
+ return false;
+ }
+
+ // Create a message pipe and thus an endpoint (outside the lock).
scoped_refptr<ChannelEndpoint> endpoint;
+ scoped_refptr<MessagePipe> message_pipe(
+ MessagePipe::CreateLocalProxy(&endpoint));
+
+ bool success = true;
{
base::AutoLock locker(lock_);
- IdToEndpointMap::iterator it = local_id_to_endpoint_map_.find(local_id);
- if (it == local_id_to_endpoint_map_.end())
- return false;
+ if (local_id_to_endpoint_map_.find(local_id) ==
+ local_id_to_endpoint_map_.end()) {
+ DCHECK(incoming_message_pipes_.find(local_id) ==
+ incoming_message_pipes_.end());
- endpoint = it->second;
+ // TODO(vtl): Use emplace when we move to C++11 unordered_maps. (It'll
+ // avoid some refcount churn.)
+ local_id_to_endpoint_map_[local_id] = endpoint;
+ incoming_message_pipes_[local_id] = message_pipe;
+ } else {
+ // We need to call |Close()| on the message pipe outside the lock.
+ success = false;
+ }
+ }
+ if (!success) {
+ DVLOG(2) << "Received attach and run endpoint for existing local ID";
+ message_pipe->Close(0);
+ return false;
}
- RunEndpoint(endpoint, remote_id);
+ endpoint->AttachAndRun(this, local_id, remote_id);
return true;
}
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h
index 57bd9ce..c09f4c0 100644
--- a/mojo/edk/system/channel.h
+++ b/mojo/edk/system/channel.h
@@ -80,24 +80,22 @@
// Attaches the given endpoint to this channel and runs it. |is_bootstrap|
// should be set if and only if it is the first endpoint on the channel. This
// assigns the endpoint both local and remote IDs. If |is_bootstrap| is set,
- // both are the bootstrap ID (given by |ChannelEndpointId::GetBootstrap()|).
+ // both are the bootstrap ID (given by |ChannelEndpointId::GetBootstrap()|);
+ // if not, it will also send a |kSubtypeChannelAttachAndRunEndpoint| message
+ // to the remote side to tell it to create an endpoint as well.
//
// (Bootstrapping is symmetric: Both sides attach and run endpoints with
// |is_bootstrap| set, which establishes the first message pipe across a
// channel.)
//
+ // This returns the *remote* ID (which will be the bootstrap ID in the
+ // bootstrap case, and a "remote ID", i.e., one for which |is_remote()|
+ // returns true, otherwise).
+ //
// TODO(vtl): Maybe limit the number of attached message pipes.
- void AttachAndRunEndpoint(scoped_refptr<ChannelEndpoint> endpoint,
- bool is_bootstrap);
-
- // Tells the other side of the channel to run a message pipe endpoint (which
- // must already be attached); |local_id| and |remote_id| are relative to this
- // channel (i.e., |local_id| is the other side's remote ID and |remote_id| is
- // its local ID).
- // TODO(vtl): Maybe we should just have a flag argument to
- // |RunMessagePipeEndpoint()| that tells it to do this.
- void RunRemoteMessagePipeEndpoint(ChannelEndpointId local_id,
- ChannelEndpointId remote_id);
+ ChannelEndpointId AttachAndRunEndpoint(
+ scoped_refptr<ChannelEndpoint> endpoint,
+ bool is_bootstrap);
// This forwards |message| verbatim to |raw_channel_|.
bool WriteMessage(scoped_ptr<MessageInTransit> message);
@@ -107,15 +105,20 @@
// |FlushWriteBufferAndShutdown()| or something like that.
bool IsWriteBufferEmpty();
- // This removes the given endpoint from this channel (|local_id| and
- // |remote_id| are specified as an optimization; the latter should be an
- // invalid |ChannelEndpointId| if the endpoint is not yet running). Note: If
- // this is called, the |Channel| will *not* call
+ // Removes the given endpoint from this channel (|local_id| and |remote_id|
+ // are specified as an optimization; the latter should be an invalid
+ // |ChannelEndpointId| if the endpoint is not yet running). Note: If this is
+ // called, the |Channel| will *not* call
// |ChannelEndpoint::DetachFromChannel()|.
void DetachEndpoint(ChannelEndpoint* endpoint,
ChannelEndpointId local_id,
ChannelEndpointId remote_id);
+ // Takes ownership of an incoming message pipe (i.e., one that was created via
+ // a |kSubtypeChannelAttachAndRunEndpoint| message).
+ scoped_refptr<MessagePipe> PassIncomingMessagePipe(
+ ChannelEndpointId local_id);
+
// See |RawChannel::GetSerializedPlatformHandleSize()|.
size_t GetSerializedPlatformHandleSize() const;
@@ -141,9 +144,9 @@
const MessageInTransit::View& message_view,
embedder::ScopedPlatformHandleVectorPtr platform_handles);
- // Handles "run message pipe endpoint" messages.
- bool OnRunMessagePipeEndpoint(ChannelEndpointId local_id,
- ChannelEndpointId remote_id);
+ // Handles "attach and run endpoint" messages.
+ bool OnAttachAndRunEndpoint(ChannelEndpointId local_id,
+ ChannelEndpointId remote_id);
// Handles "remove message pipe endpoint" messages.
bool OnRemoveMessagePipeEndpoint(ChannelEndpointId local_id,
ChannelEndpointId remote_id);
@@ -186,6 +189,11 @@
// Note: The IDs generated by this should be checked for existence before use.
LocalChannelEndpointIdGenerator local_id_generator_;
+ typedef base::hash_map<ChannelEndpointId, scoped_refptr<MessagePipe>>
+ IdToMessagePipeMap;
+ // Map from local IDs to pending/incoming endpoints (i.e., those which do not
+ // yet have a dispatcher attached).
+ IdToMessagePipeMap incoming_message_pipes_;
// TODO(vtl): We need to keep track of remote IDs (so that we don't collide
// if/when we wrap).
RemoteChannelEndpointIdGenerator remote_id_generator_;
diff --git a/mojo/edk/system/message_in_transit.cc b/mojo/edk/system/message_in_transit.cc
index eb68664..95a7d23 100644
--- a/mojo/edk/system/message_in_transit.cc
+++ b/mojo/edk/system/message_in_transit.cc
@@ -25,7 +25,7 @@
STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
MessageInTransit::kSubtypeMessagePipeEndpointData;
STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
- MessageInTransit::kSubtypeChannelRunMessagePipeEndpoint;
+ MessageInTransit::kSubtypeChannelAttachAndRunEndpoint;
STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
MessageInTransit::kSubtypeChannelRemoveMessagePipeEndpoint;
STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
diff --git a/mojo/edk/system/message_in_transit.h b/mojo/edk/system/message_in_transit.h
index 06b4f6c..2b9da6d 100644
--- a/mojo/edk/system/message_in_transit.h
+++ b/mojo/edk/system/message_in_transit.h
@@ -59,9 +59,10 @@
// Subtypes for type |kTypeMessagePipe|:
// Nothing currently.
// Subtypes for type |kTypeChannel|:
- static const Subtype kSubtypeChannelRunMessagePipeEndpoint = 0;
+ static const Subtype kSubtypeChannelAttachAndRunEndpoint = 0;
static const Subtype kSubtypeChannelRemoveMessagePipeEndpoint = 1;
static const Subtype kSubtypeChannelRemoveMessagePipeEndpointAck = 2;
+
// Subtypes for type |kTypeRawChannel|:
static const Subtype kSubtypeRawChannelPosixExtraPlatformHandles = 0;
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
index 4234eba..7db16e8 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -23,7 +23,11 @@
const unsigned kInvalidPort = static_cast<unsigned>(-1);
struct SerializedMessagePipeDispatcher {
- ChannelEndpointId endpoint_id;
+ // This is the endpoint ID on the receiving side, and should be a "remote ID".
+ // (The receiving side should have already have an endpoint attached and run
+ // via the |Channel|s. This endpoint will have both IDs assigned, so this ID
+ // is only needed to associated that endpoint with a particular dispatcher.)
+ ChannelEndpointId receiver_endpoint_id;
};
} // namespace
@@ -104,33 +108,21 @@
return scoped_refptr<MessagePipeDispatcher>();
}
- scoped_refptr<ChannelEndpoint> channel_endpoint;
- scoped_refptr<MessagePipeDispatcher> dispatcher =
- CreateRemoteMessagePipe(&channel_endpoint);
-
- ChannelEndpointId remote_id =
- static_cast<const SerializedMessagePipeDispatcher*>(source)->endpoint_id;
- if (!remote_id.is_valid()) {
- // This means that the other end was closed, and there were no messages
- // enqueued for us.
- // TODO(vtl): This is wrong. We should produce a "dead" message pipe
- // dispatcher.
- NOTIMPLEMENTED();
+ const SerializedMessagePipeDispatcher* s =
+ static_cast<const SerializedMessagePipeDispatcher*>(source);
+ scoped_refptr<MessagePipe> message_pipe =
+ channel->PassIncomingMessagePipe(s->receiver_endpoint_id);
+ if (!message_pipe.get()) {
+ LOG(ERROR) << "Failed to deserialize message pipe dispatcher (ID = "
+ << s->receiver_endpoint_id << ")";
return scoped_refptr<MessagePipeDispatcher>();
}
- ChannelEndpointId local_id = channel->AttachEndpoint(channel_endpoint);
- if (!local_id.is_valid()) {
- LOG(ERROR) << "Failed to deserialize message pipe dispatcher (failed to "
- "attach; remote ID = " << remote_id << ")";
- return scoped_refptr<MessagePipeDispatcher>();
- }
- DVLOG(2) << "Deserializing message pipe dispatcher (remote ID = " << remote_id
- << ", new local ID = " << local_id << ")";
- channel->RunEndpoint(channel_endpoint, remote_id);
-
- // TODO(vtl): FIXME -- Need some error handling here.
- channel->RunRemoteMessagePipeEndpoint(local_id, remote_id);
+ DVLOG(2) << "Deserializing message pipe dispatcher (new local ID = "
+ << s->receiver_endpoint_id << ")";
+ scoped_refptr<MessagePipeDispatcher> dispatcher(
+ new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions));
+ dispatcher->Init(message_pipe, 0);
return dispatcher;
}
@@ -243,22 +235,15 @@
embedder::PlatformHandleVector* /*platform_handles*/) {
DCHECK(HasOneRef()); // Only one ref => no need to take the lock.
+ SerializedMessagePipeDispatcher* s =
+ static_cast<SerializedMessagePipeDispatcher*>(destination);
+
// Convert the local endpoint to a proxy endpoint (moving the message queue)
// and attach it to the channel.
- ChannelEndpointId endpoint_id =
- channel->AttachEndpoint(message_pipe_->ConvertLocalToProxy(port_));
- // Note: It's okay to get an invalid endpoint ID. (It's possible that the
- // other endpoint -- the one that we're not sending -- was closed in the
- // intervening time.) In that case, we need to deserialize a "dead" message
- // pipe dispatcher on the other end. (Note that this is different from just
- // producing |MOJO_HANDLE_INVALID|.)
- DVLOG(2) << "Serializing message pipe dispatcher (local ID = " << endpoint_id
- << ")";
-
- // We now have a local ID. Before we can run the proxy endpoint, we need to
- // get an ack back from the other side with the remote ID.
- static_cast<SerializedMessagePipeDispatcher*>(destination)->endpoint_id =
- endpoint_id;
+ s->receiver_endpoint_id = channel->AttachAndRunEndpoint(
+ message_pipe_->ConvertLocalToProxy(port_), false);
+ DVLOG(2) << "Serializing message pipe dispatcher (remote ID = "
+ << s->receiver_endpoint_id << ")";
message_pipe_ = nullptr;
port_ = kInvalidPort;
diff --git a/mojo/examples/apptest/example_apptest.cc b/mojo/examples/apptest/example_apptest.cc
index c754c85..dba00e0 100644
--- a/mojo/examples/apptest/example_apptest.cc
+++ b/mojo/examples/apptest/example_apptest.cc
@@ -18,32 +18,83 @@
#include "mojo/public/cpp/utility/run_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace {
-
-// TODO(msw): Remove this once we can get ApplicationImpl from TLS.
-mojo::ApplicationImpl* g_application_impl_hack = NULL;
-
-} // namespace
-
namespace mojo {
namespace {
-class ExampleApptest : public testing::Test {
+// This global shell handle is needed for repeated use by test applications.
+MessagePipeHandle g_shell_message_pipe_handle_hack;
+
+// Apptest is a GTEST base class for application testing executed in mojo_shell.
+class Apptest : public testing::Test {
public:
- ExampleApptest() {
- g_application_impl_hack->ConnectToService("mojo:mojo_example_service",
- &example_service_);
- example_service_.set_client(&example_client_);
+ explicit Apptest(Array<String> args)
+ : args_(args.Pass()),
+ application_impl_(nullptr) {
+ }
+ virtual ~Apptest() override {}
+
+ protected:
+ ApplicationImpl* application_impl() { return application_impl_; }
+
+ // Get the ApplicationDelegate for the application to be tested.
+ virtual ApplicationDelegate* GetApplicationDelegate() = 0;
+
+ // testing::Test:
+ virtual void SetUp() override {
+ // New applications are constructed for each test to avoid persisting state.
+ MOJO_CHECK(g_shell_message_pipe_handle_hack.is_valid());
+ application_impl_ = new ApplicationImpl(
+ GetApplicationDelegate(),
+ MakeScopedHandle(g_shell_message_pipe_handle_hack));
+
+ // Fake application initialization with the given command line arguments.
+ application_impl_->Initialize(args_.Clone());
+ }
+ virtual void TearDown() override {
+ g_shell_message_pipe_handle_hack =
+ application_impl_->UnbindShell().release();
+ delete application_impl_;
}
+ private:
+ // The command line arguments supplied to each test application instance.
+ Array<String> args_;
+
+ // The application implementation instance, reconstructed for each test.
+ ApplicationImpl* application_impl_;
+
+ // A run loop is needed for ApplicationImpl initialization and communication.
+ RunLoop run_loop_;
+
+ MOJO_DISALLOW_COPY_AND_ASSIGN(Apptest);
+};
+
+// ExampleApptest exemplifies Apptest's application testing pattern.
+class ExampleApptest : public Apptest {
+ public:
+ // TODO(msw): Exemplify the use of actual command line arguments.
+ ExampleApptest() : Apptest(Array<String>()) {}
virtual ~ExampleApptest() override {}
protected:
+ // Apptest:
+ virtual ApplicationDelegate* GetApplicationDelegate() override {
+ return &example_client_application_;
+ }
+ virtual void SetUp() override {
+ Apptest::SetUp();
+ application_impl()->ConnectToService("mojo:mojo_example_service",
+ &example_service_);
+ example_service_.set_client(&example_client_);
+ }
+
ExampleServicePtr example_service_;
ExampleClientImpl example_client_;
private:
+ ExampleClientApplication example_client_application_;
+
MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleApptest);
};
@@ -64,9 +115,9 @@
}
template <typename T>
-struct SetAndQuit : public Callback<void()>::Runnable {
- SetAndQuit(T* val, T result) : val_(val), result_(result) {}
- virtual ~SetAndQuit() {}
+struct SetCallback : public Callback<void()>::Runnable {
+ SetCallback(T* val, T result) : val_(val), result_(result) {}
+ virtual ~SetCallback() {}
virtual void Run() const override { *val_ = result_; }
T* val_;
T result_;
@@ -75,7 +126,7 @@
TEST_F(ExampleApptest, RunCallbackViaService) {
// Test ExampleService callback functionality.
bool was_run = false;
- example_service_->RunCallback(SetAndQuit<bool>(&was_run, true));
+ example_service_->RunCallback(SetCallback<bool>(&was_run, true));
EXPECT_TRUE(example_service_.WaitForIncomingMethodCall());
EXPECT_TRUE(was_run);
}
@@ -85,19 +136,23 @@
} // namespace mojo
MojoResult MojoMain(MojoHandle shell_handle) {
- mojo::Environment env;
- // TODO(msw): Destroy this ambient RunLoop before running tests.
- // Need to CancelWait() / PassMessagePipe() from the ShellPtr?
- mojo::RunLoop loop;
- mojo::ApplicationDelegate* delegate = new mojo::ExampleClientApplication();
- mojo::ApplicationImpl app(delegate, shell_handle);
- g_application_impl_hack = &app;
- MOJO_CHECK(app.WaitForInitialize());
+ mojo::Environment environment;
{
+ // This RunLoop is used for init, and then destroyed before running tests.
+ mojo::RunLoop run_loop;
+
+ // Construct an ApplicationImpl just for the GTEST commandline arguments.
+ // GTEST command line arguments are supported amid application arguments:
+ // mojo_shell 'mojo:mojo_example_apptest arg1 --gtest_filter=foo arg2'
+ mojo::ApplicationDelegate dummy_application_delegate;
+ mojo::ApplicationImpl app(&dummy_application_delegate, shell_handle);
+ MOJO_CHECK(app.WaitForInitialize());
+
// InitGoogleTest expects (argc + 1) elements, including a terminating NULL.
// It also removes GTEST arguments from |argv| and updates the |argc| count.
- const mojo::Array<mojo::String>& args = app.args();
+ // TODO(msw): Provide tests access to these actual command line arguments.
+ const std::vector<std::string>& args = app.args();
MOJO_CHECK(args.size() < INT_MAX);
int argc = static_cast<int>(args.size());
std::vector<char*> argv(argc + 1);
@@ -105,10 +160,14 @@
argv[i] = const_cast<char*>(args[i].data());
argv[argc] = NULL;
testing::InitGoogleTest(&argc, &argv[0]);
+ mojo::g_shell_message_pipe_handle_hack = app.UnbindShell().release();
}
mojo_ignore_result(RUN_ALL_TESTS());
- delete delegate;
+ MojoResult result = MojoClose(mojo::g_shell_message_pipe_handle_hack.value());
+ MOJO_ALLOW_UNUSED_LOCAL(result);
+ assert(result == MOJO_RESULT_OK);
+
return MOJO_RESULT_OK;
}
diff --git a/mojo/examples/http_server/BUILD.gn b/mojo/examples/http_server/BUILD.gn
index d4013c4..8388a84 100644
--- a/mojo/examples/http_server/BUILD.gn
+++ b/mojo/examples/http_server/BUILD.gn
@@ -11,6 +11,7 @@
deps = [
"//base",
+ "//mojo/common",
"//mojo/public/c/system:for_shared_library",
"//mojo/public/cpp/application:standalone",
"//mojo/public/cpp/bindings",
diff --git a/mojo/examples/http_server/http_server.cc b/mojo/examples/http_server/http_server.cc
index cc8df20..389c953 100644
--- a/mojo/examples/http_server/http_server.cc
+++ b/mojo/examples/http_server/http_server.cc
@@ -3,17 +3,100 @@
// found in the LICENSE file.
#include <stdio.h>
+#include <arpa/inet.h>
#include "base/bind.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/common/handle_watcher.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_runner.h"
+#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/services/public/interfaces/network/network_service.mojom.h"
namespace mojo {
namespace examples {
+// The canned response that this server replies to each request with.
+const char kResponse[] =
+ "HTTP/1.0 200 OK\n"
+ "Content-Type: text/html; charset=utf-8\n"
+ "\n"
+ "Hello, world\n";
+
+// Represents one connection to a client. This connection will manage its own
+// lifetime and will delete itself when the connection is closed.
+class Connection {
+ public:
+ Connection(TCPConnectedSocketPtr conn,
+ ScopedDataPipeProducerHandle sender,
+ ScopedDataPipeConsumerHandle receiver)
+ : connection_(conn.Pass()),
+ sender_(sender.Pass()),
+ receiver_(receiver.Pass()),
+ weak_ptr_factory_(this),
+ response_(kResponse),
+ response_offset_(0) {
+ WriteMore();
+ }
+
+ ~Connection() {
+ }
+
+ private:
+ void OnSenderReady(MojoResult result) {
+ WriteMore();
+ }
+
+ void WriteMore() {
+ uint32_t num_bytes =
+ static_cast<uint32_t>(response_.size() - response_offset_);
+ // TODO(brettw) write chunks (ideally capped at some small size to
+ // illustrate how it works even in the presence of our relatively small
+ // reply) rather than specifying ALL_OR_NONE. See below.
+ MojoResult result = WriteDataRaw(
+ sender_.get(), &response_[response_offset_], &num_bytes,
+ MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
+ if (result == MOJO_RESULT_SHOULD_WAIT) {
+ num_bytes = 0;
+ } else if (result != MOJO_RESULT_OK) {
+ printf("Error writing to pipe.\n");
+ delete this;
+ return;
+ }
+
+ response_offset_ += num_bytes;
+
+ if (response_offset_ == response_.size()) {
+ // Connection complete.
+ delete this;
+ return;
+ }
+
+ // Wait for sender to be writable.
+ // TODO(brettw) we won't actually get here since we ALL_OR_NONE was
+ // specified above. This call won't work because the message loop is not a
+ // Chromium message loop. Instead, we probably need to use
+ // Environment::GetDefaultAsyncWaiter to wait on the handles and remove the
+ // ALL_OR_NONE flag.
+ sender_watcher_.Start(
+ sender_.get(),
+ MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&Connection::OnSenderReady, weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ TCPConnectedSocketPtr connection_;
+ ScopedDataPipeProducerHandle sender_;
+ ScopedDataPipeConsumerHandle receiver_;
+
+ base::WeakPtrFactory<Connection> weak_ptr_factory_;
+ common::HandleWatcher sender_watcher_;
+
+ std::string response_;
+ size_t response_offset_;
+};
+
class HttpServerApp : public ApplicationDelegate {
public:
virtual void Initialize(ApplicationImpl* app) override {
@@ -22,26 +105,60 @@
}
private:
- void OnListeningStarted(NetworkErrorPtr err) {
- }
-
void OnSocketBound(NetworkErrorPtr err, NetAddressPtr bound_address) {
if (err->code != 0) {
printf("Bound err = %d\n", err->code);
return;
}
- printf("Got address = %d.%d.%d.%d:%d\n",
+ printf("Got address %d.%d.%d.%d:%d\n",
(int)bound_address->ipv4->addr[0],
(int)bound_address->ipv4->addr[1],
(int)bound_address->ipv4->addr[2],
(int)bound_address->ipv4->addr[3],
(int)bound_address->ipv4->port);
+ }
- bound_socket_->StartListening(
- GetProxy(&server_socket_),
- base::Bind(&HttpServerApp::OnListeningStarted,
- base::Unretained(this)));
+ void OnSocketListening(NetworkErrorPtr err) {
+ if (err->code != 0) {
+ printf("Listen err = %d\n", err->code);
+ return;
+ }
+ printf("Waiting for incoming connections...\n");
+ }
+
+ void OnConnectionAccepted(NetworkErrorPtr err, NetAddressPtr remote_address) {
+ if (err->code != 0) {
+ printf("Accepted socket error = %d\n", err->code);
+ return;
+ }
+
+ new Connection(pending_connected_socket_.Pass(),
+ pending_send_handle_.Pass(),
+ pending_receive_handle_.Pass());
+
+ // Ready for another connection.
+ WaitForNextConnection();
+ }
+
+ void WaitForNextConnection() {
+ // Need two pipes (one for each direction).
+ ScopedDataPipeConsumerHandle send_consumer_handle;
+ MojoResult result = CreateDataPipe(
+ nullptr, &pending_send_handle_, &send_consumer_handle);
+ assert(result == MOJO_RESULT_OK);
+
+ ScopedDataPipeProducerHandle receive_producer_handle;
+ result = CreateDataPipe(
+ nullptr, &receive_producer_handle, &pending_receive_handle_);
+ assert(result == MOJO_RESULT_OK);
+ MOJO_ALLOW_UNUSED_LOCAL(result);
+
+ server_socket_->Accept(send_consumer_handle.Pass(),
+ receive_producer_handle.Pass(),
+ GetProxy(&pending_connected_socket_),
+ base::Bind(&HttpServerApp::OnConnectionAccepted,
+ base::Unretained(this)));
}
void Start() {
@@ -49,20 +166,32 @@
net_address->family = NET_ADDRESS_FAMILY_IPV4;
net_address->ipv4 = NetAddressIPv4::New();
net_address->ipv4->addr.resize(4);
- net_address->ipv4->addr[0] = 0;
+ net_address->ipv4->addr[0] = 127;
net_address->ipv4->addr[1] = 0;
net_address->ipv4->addr[2] = 0;
- net_address->ipv4->addr[3] = 0;
+ net_address->ipv4->addr[3] = 1;
+ net_address->ipv4->port = 0;
+ // Note that we can start using the proxies right away even thought the
+ // callbacks have not been called yet. If a previous step fails, they'll
+ // all fail.
network_service_->CreateTCPBoundSocket(
net_address.Pass(),
GetProxy(&bound_socket_),
base::Bind(&HttpServerApp::OnSocketBound, base::Unretained(this)));
+ bound_socket_->StartListening(GetProxy(
+ &server_socket_),
+ base::Bind(&HttpServerApp::OnSocketListening, base::Unretained(this)));
+ WaitForNextConnection();
}
NetworkServicePtr network_service_;
TCPBoundSocketPtr bound_socket_;
TCPServerSocketPtr server_socket_;
+
+ ScopedDataPipeProducerHandle pending_send_handle_;
+ ScopedDataPipeConsumerHandle pending_receive_handle_;
+ TCPConnectedSocketPtr pending_connected_socket_;
};
} // namespace examples
diff --git a/mojo/examples/wget/wget.cc b/mojo/examples/wget/wget.cc
index 09c4f7b..1efaa2d 100644
--- a/mojo/examples/wget/wget.cc
+++ b/mojo/examples/wget/wget.cc
@@ -76,8 +76,8 @@
}
private:
- void Start(const Array<String>& args) {
- std::string url((args.size() > 1) ? args[1].get() : PromptForURL());
+ void Start(const std::vector<std::string>& args) {
+ std::string url((args.size() > 1) ? args[1] : PromptForURL());
printf("Loading: %s\n", url.c_str());
network_service_->CreateURLLoader(GetProxy(&url_loader_));
diff --git a/mojo/examples/window_manager/debug_panel.cc b/mojo/examples/window_manager/debug_panel.cc
index 7d86cfe..7551fb4 100644
--- a/mojo/examples/window_manager/debug_panel.cc
+++ b/mojo/examples/window_manager/debug_panel.cc
@@ -99,7 +99,7 @@
navigation_target_new_,
navigation_target_source_,
};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(radios); ++i) {
+ for (size_t i = 0; i < arraysize(radios); ++i) {
radios[i]->SetBounds(kControlBorderInset, y, w,
radios[i]->GetPreferredSize().height());
y += radios[i]->height();
@@ -111,7 +111,7 @@
close_last_,
cross_app_,
};
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(buttons); ++i) {
+ for (size_t i = 0; i < arraysize(buttons); ++i) {
buttons[i]->SetBounds(kControlBorderInset, y, w,
buttons[i]->GetPreferredSize().height());
y += buttons[i]->height();
diff --git a/mojo/public/cpp/application/application_impl.h b/mojo/public/cpp/application/application_impl.h
index b647427..e5b27be 100644
--- a/mojo/public/cpp/application/application_impl.h
+++ b/mojo/public/cpp/application/application_impl.h
@@ -60,7 +60,7 @@
Shell* shell() const { return shell_.get(); }
// Returns any initial configuration arguments, passed by the Shell.
- const Array<String>& args() { return args_; }
+ const std::vector<std::string>& args() const { return args_; }
// Establishes a new connection to an application. Caller does not own.
ApplicationConnection* ConnectToApplication(const String& application_url);
@@ -76,6 +76,12 @@
// Wait for the ShellPtr's Initialize message.
bool WaitForInitialize();
+ // Unbind the shell from this application and return its handle.
+ ScopedMessagePipeHandle UnbindShell();
+
+ // Application implementation.
+ virtual void Initialize(Array<String> args) override;
+
private:
class ShellPtrWatcher;
@@ -90,7 +96,6 @@
static void Terminate();
// Application implementation.
- virtual void Initialize(Array<String> args) override;
virtual void AcceptConnection(const String& requestor_url,
ServiceProviderPtr provider) override;
@@ -102,7 +107,7 @@
ApplicationDelegate* delegate_;
ShellPtr shell_;
ShellPtrWatcher* shell_watch_;
- Array<String> args_;
+ std::vector<std::string> args_;
MOJO_DISALLOW_COPY_AND_ASSIGN(ApplicationImpl);
};
diff --git a/mojo/public/cpp/application/lib/application_impl.cc b/mojo/public/cpp/application/lib/application_impl.cc
index e237aef..6a5560d 100644
--- a/mojo/public/cpp/application/lib/application_impl.cc
+++ b/mojo/public/cpp/application/lib/application_impl.cc
@@ -54,13 +54,6 @@
delete shell_watch_;
}
-void ApplicationImpl::Initialize(Array<String> args) {
- MOJO_CHECK(!initialized_);
- initialized_ = true;
- args_ = args.Pass();
- delegate_->Initialize(this);
-}
-
ApplicationConnection* ApplicationImpl::ConnectToApplication(
const String& application_url) {
MOJO_CHECK(initialized_);
@@ -84,6 +77,17 @@
return result;
}
+ScopedMessagePipeHandle ApplicationImpl::UnbindShell() {
+ return shell_.PassMessagePipe();
+}
+
+void ApplicationImpl::Initialize(Array<String> args) {
+ MOJO_CHECK(!initialized_);
+ initialized_ = true;
+ args_ = args.To<std::vector<std::string>>();
+ delegate_->Initialize(this);
+}
+
void ApplicationImpl::BindShell(ScopedMessagePipeHandle shell_handle) {
shell_watch_ = new ShellPtrWatcher(this);
shell_.Bind(shell_handle.Pass());
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h
index e73553d..eacf298 100644
--- a/mojo/public/cpp/bindings/lib/array_serialization.h
+++ b/mojo/public/cpp/bindings/lib/array_serialization.h
@@ -63,11 +63,13 @@
static_assert((IsSame<ElementValidateParams, NoValidateParams>::value),
"Primitive type should not have array validate params");
- memcpy(output->storage(), &input.storage()[0], input.size() * sizeof(E));
+ if (input.size())
+ memcpy(output->storage(), &input.storage()[0], input.size() * sizeof(E));
}
static void DeserializeElements(Array_Data<F>* input, Array<E>* output) {
std::vector<E> result(input->size());
- memcpy(&result[0], input->storage(), input->size() * sizeof(E));
+ if (input->size())
+ memcpy(&result[0], input->storage(), input->size() * sizeof(E));
output->Swap(&result);
}
};
diff --git a/mojo/public/cpp/bindings/tests/array_unittest.cc b/mojo/public/cpp/bindings/tests/array_unittest.cc
index 133fa8b..0b083c7 100644
--- a/mojo/public/cpp/bindings/tests/array_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/array_unittest.cc
@@ -171,6 +171,21 @@
EXPECT_EQ(static_cast<int32_t>(i), array2[i]);
}
+TEST_F(ArrayTest, Serialization_EmptyArrayOfPOD) {
+ Array<int32_t> array(0);
+ size_t size = GetSerializedSize_(array);
+ EXPECT_EQ(8U, size);
+
+ FixedBuffer buf(size);
+ Array_Data<int32_t>* data;
+ SerializeArray_<ArrayValidateParams<0, false, NoValidateParams>>(
+ array.Pass(), &buf, &data);
+
+ Array<int32_t> array2;
+ Deserialize_(data, &array2);
+ EXPECT_EQ(0U, array2.size());
+}
+
TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) {
Array<Array<int32_t>> array(2);
for (size_t j = 0; j < array.size(); ++j) {
diff --git a/mojo/services/html_viewer/blink_input_events_type_converters.cc b/mojo/services/html_viewer/blink_input_events_type_converters.cc
index ff1a2cb..4f88656 100644
--- a/mojo/services/html_viewer/blink_input_events_type_converters.cc
+++ b/mojo/services/html_viewer/blink_input_events_type_converters.cc
@@ -107,7 +107,7 @@
web_event->clickCount = GetClickCount(event->flags);
- return web_event.PassAs<blink::WebInputEvent>();
+ return web_event.Pass();
}
scoped_ptr<blink::WebInputEvent> BuildWebKeyboardEvent(
@@ -139,7 +139,7 @@
web_event->unmodifiedText[0] = event->key_data->unmodified_text;
web_event->setKeyIdentifierFromWindowsKeyCode();
- return web_event.PassAs<blink::WebInputEvent>();
+ return web_event.Pass();
}
scoped_ptr<blink::WebInputEvent> BuildWebMouseWheelEventFrom(
@@ -173,7 +173,7 @@
web_event->wheelTicksX = web_event->deltaX / kPixelsPerTick;
web_event->wheelTicksY = web_event->deltaY / kPixelsPerTick;
- return web_event.PassAs<blink::WebInputEvent>();
+ return web_event.Pass();
}
} // namespace
diff --git a/mojo/services/html_viewer/webmimeregistry_impl.cc b/mojo/services/html_viewer/webmimeregistry_impl.cc
index 2faac17..f054d5d 100644
--- a/mojo/services/html_viewer/webmimeregistry_impl.cc
+++ b/mojo/services/html_viewer/webmimeregistry_impl.cc
@@ -8,6 +8,7 @@
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
+#include "media/filters/stream_parser_factory.h"
#include "net/base/mime_util.h"
#include "third_party/WebKit/public/platform/WebString.h"
@@ -89,8 +90,14 @@
bool WebMimeRegistryImpl::supportsMediaSourceMIMEType(
const blink::WebString& mime_type,
const blink::WebString& codecs) {
- NOTIMPLEMENTED();
- return false;
+ const std::string mime_type_ascii = ToASCIIOrEmpty(mime_type);
+ if (mime_type_ascii.empty())
+ return false;
+
+ std::vector<std::string> parsed_codec_ids;
+ net::ParseCodecString(ToASCIIOrEmpty(codecs), &parsed_codec_ids, false);
+ return media::StreamParserFactory::IsTypeSupported(mime_type_ascii,
+ parsed_codec_ids);
}
bool WebMimeRegistryImpl::supportsEncryptedMediaMIMEType(
diff --git a/mojo/services/native_viewport/main.cc b/mojo/services/native_viewport/main.cc
index 7db4705..3271cc4 100644
--- a/mojo/services/native_viewport/main.cc
+++ b/mojo/services/native_viewport/main.cc
@@ -32,13 +32,13 @@
private:
bool HasArg(const std::string& arg) {
- return std::find(args_.begin(), args_.end(), arg) != args_.end();
+ const auto& args = app_->args();
+ return std::find(args.begin(), args.end(), arg) != args.end();
}
// ApplicationDelegate implementation.
virtual void Initialize(ApplicationImpl* application) override {
app_ = application;
- args_ = application->args().To<std::vector<std::string> >();
#if !defined(COMPONENT_BUILD)
if (HasArg(kUseTestConfig))
@@ -70,7 +70,6 @@
}
ApplicationImpl* app_;
- std::vector<std::string> args_;
scoped_refptr<gfx::GLShareGroup> share_group_;
scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_;
bool is_headless_;
diff --git a/mojo/services/network/network_service_impl.cc b/mojo/services/network/network_service_impl.cc
index a622322..6f2f550 100644
--- a/mojo/services/network/network_service_impl.cc
+++ b/mojo/services/network/network_service_impl.cc
@@ -14,19 +14,6 @@
namespace mojo {
-namespace {
-
-// Allows a Callback<NetworkErrorPtr, NetAddressPtr> to be called by a
-// Callback<NetworkErrorPtr> when the address is already known.
-void BoundAddressCallbackAdapter(
- const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback,
- NetAddressPtr address,
- NetworkErrorPtr err) {
- callback.Run(err.Pass(), address.Pass());
-}
-
-} // namespace
-
NetworkServiceImpl::NetworkServiceImpl(ApplicationConnection* connection,
NetworkContext* context)
: context_(context),
@@ -70,19 +57,10 @@
ScopedDataPipeProducerHandle receive_stream,
InterfaceRequest<TCPConnectedSocket> client_socket,
const Callback<void(NetworkErrorPtr, NetAddressPtr)>& callback) {
- TCPBoundSocketImpl bound_socket;
- int net_error = bound_socket.Bind(NetAddressPtr());
- if (net_error != net::OK) {
- callback.Run(MakeNetworkError(net_error), NetAddressPtr());
- return;
- }
-
- bound_socket.Connect(
- remote_address.Pass(), send_stream.Pass(), receive_stream.Pass(),
- client_socket.Pass(),
- base::Bind(&BoundAddressCallbackAdapter,
- callback,
- base::Passed(bound_socket.GetLocalAddress().Pass())));
+ // TODO(brettw) implement this. We need to know what type of socket to use
+ // so we can create the right one (i.e. to pass to TCPSocket::Open) before
+ // doing the connect.
+ callback.Run(MakeNetworkError(net::ERR_NOT_IMPLEMENTED), NetAddressPtr());
}
void NetworkServiceImpl::CreateUDPSocket(InterfaceRequest<UDPSocket> socket) {
diff --git a/mojo/services/network/tcp_bound_socket_impl.cc b/mojo/services/network/tcp_bound_socket_impl.cc
index 6660520..8272b22 100644
--- a/mojo/services/network/tcp_bound_socket_impl.cc
+++ b/mojo/services/network/tcp_bound_socket_impl.cc
@@ -19,10 +19,7 @@
}
int TCPBoundSocketImpl::Bind(NetAddressPtr local_address) {
- // The local address might be null to match any port.
- net::IPEndPoint end_point;
- if (!local_address.is_null())
- end_point = local_address.To<net::IPEndPoint>();
+ net::IPEndPoint end_point = local_address.To<net::IPEndPoint>();
socket_.reset(new net::TCPSocket(NULL, net::NetLog::Source()));
int result = socket_->Open(end_point.GetFamily());
@@ -50,7 +47,7 @@
void TCPBoundSocketImpl::StartListening(
InterfaceRequest<TCPServerSocket> server,
const Callback<void(NetworkErrorPtr)>& callback) {
- if (!socket_) {
+ if (!socket_ || pending_connect_socket_.is_pending()) {
// A bound socket will only be returned to the caller after binding
// succeeds, so if the socket doesn't exist, that means ownership was
// already passed to a server socket or client socket.
@@ -76,7 +73,49 @@
ScopedDataPipeProducerHandle receive_stream,
InterfaceRequest<TCPConnectedSocket> client_socket,
const Callback<void(NetworkErrorPtr)>& callback) {
- // TODO(brettw) write this.
+ if (!socket_ || pending_connect_socket_.is_pending()) {
+ // A bound socket will only be returned to the caller after binding
+ // succeeds, so if the socket doesn't exist, that means ownership was
+ // already passed to a server socket or client socket.
+ callback.Run(MakeNetworkError(net::ERR_FAILED));
+ return;
+ }
+
+ net::IPEndPoint end_point = remote_address.To<net::IPEndPoint>();
+
+ pending_connect_send_stream_ = send_stream.Pass();
+ pending_connect_receive_stream_ = receive_stream.Pass();
+ pending_connect_socket_ = client_socket.Pass();
+ pending_connect_callback_ = callback;
+ int result = socket_->Connect(
+ end_point,
+ base::Bind(&TCPBoundSocketImpl::OnConnected, base::Unretained(this)));
+ if (result == net::OK) {
+ OnConnected(result);
+ } else if (result != net::ERR_IO_PENDING) {
+ // Error occurred.
+ pending_connect_send_stream_.reset();
+ pending_connect_receive_stream_.reset();
+ pending_connect_socket_ = InterfaceRequest<TCPConnectedSocket>();
+ pending_connect_callback_ = Callback<void(NetworkErrorPtr)>();
+ callback.Run(MakeNetworkError(result));
+ }
+}
+
+void TCPBoundSocketImpl::OnConnected(int result) {
+ if (result == net::OK) {
+ BindToRequest(new TCPConnectedSocketImpl(
+ socket_.Pass(),
+ pending_connect_send_stream_.Pass(),
+ pending_connect_receive_stream_.Pass()),
+ &pending_connect_socket_);
+ } else {
+ pending_connect_send_stream_.reset();
+ pending_connect_receive_stream_.reset();
+ pending_connect_socket_ = InterfaceRequest<TCPConnectedSocket>();
+ }
+ pending_connect_callback_.Run(MakeNetworkError(result));
+ pending_connect_callback_ = Callback<void(NetworkErrorPtr)>();
}
} // namespace mojo
diff --git a/mojo/services/network/tcp_bound_socket_impl.h b/mojo/services/network/tcp_bound_socket_impl.h
index 5fb1bf3..39a78f6 100644
--- a/mojo/services/network/tcp_bound_socket_impl.h
+++ b/mojo/services/network/tcp_bound_socket_impl.h
@@ -17,6 +17,9 @@
TCPBoundSocketImpl();
virtual ~TCPBoundSocketImpl();
+ // Does the actual binding. Returns a net error code. On net::OK, the bound
+ // socket will be ready to use and send back to the client. On failure, this
+ // object should be destroyed and no longer used.
int Bind(NetAddressPtr local_address);
// Returns the local address associated with this socket. This should only
@@ -35,7 +38,15 @@
const Callback<void(NetworkErrorPtr)>& callback) override;
private:
+ void OnConnected(int result);
+
scoped_ptr<net::TCPSocket> socket_;
+
+ // Valid when waiting for a connect callback.
+ ScopedDataPipeConsumerHandle pending_connect_send_stream_;
+ ScopedDataPipeProducerHandle pending_connect_receive_stream_;
+ InterfaceRequest<TCPConnectedSocket> pending_connect_socket_;
+ Callback<void(NetworkErrorPtr)> pending_connect_callback_;
};
} // namespace mojo
diff --git a/mojo/services/network/tcp_connected_socket_impl.cc b/mojo/services/network/tcp_connected_socket_impl.cc
index 0c6f2eb..ecd174c 100644
--- a/mojo/services/network/tcp_connected_socket_impl.cc
+++ b/mojo/services/network/tcp_connected_socket_impl.cc
@@ -4,6 +4,10 @@
#include "mojo/services/network/tcp_connected_socket_impl.h"
+#include "base/message_loop/message_loop.h"
+#include "mojo/services/network/net_adapters.h"
+#include "net/base/net_errors.h"
+
namespace mojo {
TCPConnectedSocketImpl::TCPConnectedSocketImpl(
@@ -12,10 +16,148 @@
ScopedDataPipeProducerHandle receive_stream)
: socket_(socket.Pass()),
send_stream_(send_stream.Pass()),
- receive_stream_(receive_stream.Pass()) {
+ receive_stream_(receive_stream.Pass()),
+ weak_ptr_factory_(this) {
+ // Queue up async communication.
+ ReceiveMore();
+ SendMore();
}
TCPConnectedSocketImpl::~TCPConnectedSocketImpl() {
}
+void TCPConnectedSocketImpl::ReceiveMore() {
+ DCHECK(!pending_receive_.get());
+
+ uint32_t num_bytes;
+ MojoResult result = NetToMojoPendingBuffer::BeginWrite(
+ &receive_stream_, &pending_receive_, &num_bytes);
+ if (result == MOJO_RESULT_SHOULD_WAIT) {
+ // The pipe is full. We need to wait for it to have more space.
+ receive_handle_watcher_.Start(
+ receive_stream_.get(),
+ MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&TCPConnectedSocketImpl::OnReceiveStreamReady,
+ weak_ptr_factory_.GetWeakPtr()));
+ return;
+ } else if (result != MOJO_RESULT_OK) {
+ // The receive stream is in a bad state.
+ // TODO(darin): How should this be communicated to our client?
+ socket_->Close();
+ return;
+ }
+
+ // Mojo is ready for the receive.
+ CHECK_GT(static_cast<uint32_t>(std::numeric_limits<int>::max()), num_bytes);
+ scoped_refptr<net::IOBuffer> buf(
+ new NetToMojoIOBuffer(pending_receive_.get()));
+ int read_result = socket_->Read(
+ buf.get(), static_cast<int>(num_bytes),
+ base::Bind(&TCPConnectedSocketImpl::DidReceive, base::Unretained(this),
+ false));
+ if (read_result == net::ERR_IO_PENDING) {
+ // Pending I/O, wait for result in DidReceive().
+ } else if (read_result >= 0) {
+ // Synchronous data ready.
+ DidReceive(true, read_result);
+ } else {
+ // Some kind of error.
+ // TODO(brettw) notify caller of error.
+ socket_->Close();
+ }
+}
+
+void TCPConnectedSocketImpl::OnReceiveStreamReady(MojoResult result) {
+ // TODO(darin): Handle a bad |result| value.
+ ReceiveMore();
+}
+
+void TCPConnectedSocketImpl::DidReceive(bool completed_synchronously,
+ int result) {
+ if (result < 0) {
+ // Error.
+ pending_receive_ = NULL; // Closes the pipe (owned by the pending write).
+ // TODO(brettw) notify the caller of an error?
+ socket_->Close();
+ return;
+ }
+
+ receive_stream_ = pending_receive_->Complete(result);
+ pending_receive_ = NULL;
+
+ // Schedule more reading.
+ if (completed_synchronously) {
+ // Don't recursively call ReceiveMore if this is a sync read.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&TCPConnectedSocketImpl::ReceiveMore,
+ weak_ptr_factory_.GetWeakPtr()));
+ } else {
+ ReceiveMore();
+ }
+}
+
+void TCPConnectedSocketImpl::SendMore() {
+ uint32_t num_bytes = 0;
+ MojoResult result = MojoToNetPendingBuffer::BeginRead(
+ &send_stream_, &pending_send_, &num_bytes);
+ if (result == MOJO_RESULT_SHOULD_WAIT) {
+ // Data not ready, wait for it.
+ send_handle_watcher_.Start(
+ send_stream_.get(),
+ MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE,
+ base::Bind(&TCPConnectedSocketImpl::OnSendStreamReady,
+ weak_ptr_factory_.GetWeakPtr()));
+ return;
+ } else if (result != MOJO_RESULT_OK) {
+ // TODO(brettw) notify caller of error.
+ socket_->Close();
+ return;
+ }
+
+ // Got a buffer from Mojo, give it to the socket. Note that the sockets may
+ // do partial writes.
+ scoped_refptr<net::IOBuffer> buf(new MojoToNetIOBuffer(pending_send_.get()));
+ int write_result = socket_->Write(
+ buf.get(), static_cast<int>(num_bytes),
+ base::Bind(&TCPConnectedSocketImpl::DidSend, base::Unretained(this),
+ false));
+ if (write_result == net::ERR_IO_PENDING) {
+ // Pending I/O, wait for result in DidSend().
+ } else if (write_result >= 0) {
+ // Synchronous data consumed.
+ DidSend(true, write_result);
+ }
+}
+
+void TCPConnectedSocketImpl::OnSendStreamReady(MojoResult result) {
+ // TODO(brettw): Handle a bad |result| value.
+ SendMore();
+}
+
+void TCPConnectedSocketImpl::DidSend(bool completed_synchronously,
+ int result) {
+ if (result < 0) {
+ // TODO(brettw) report error.
+ pending_send_ = NULL;
+ socket_->Close();
+ return;
+ }
+
+ // Take back ownership of the stream and free the IOBuffer.
+ send_stream_ = pending_send_->Complete(result);
+ pending_send_ = NULL;
+
+ // Schedule more writing.
+ if (completed_synchronously) {
+ // Don't recursively call SendMore if this is a sync read.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&TCPConnectedSocketImpl::SendMore,
+ weak_ptr_factory_.GetWeakPtr()));
+ } else {
+ SendMore();
+ }
+}
+
} // namespace mojo
diff --git a/mojo/services/network/tcp_connected_socket_impl.h b/mojo/services/network/tcp_connected_socket_impl.h
index 5c24011..e579b29 100644
--- a/mojo/services/network/tcp_connected_socket_impl.h
+++ b/mojo/services/network/tcp_connected_socket_impl.h
@@ -6,12 +6,17 @@
#define MOJO_SERVICES_NETWORK_TCP_CONNECTED_SOCKET_H_
#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/common/handle_watcher.h"
#include "mojo/public/cpp/bindings/interface_impl.h"
#include "mojo/services/public/interfaces/network/tcp_connected_socket.mojom.h"
#include "net/socket/tcp_socket.h"
namespace mojo {
+class MojoToNetPendingBuffer;
+class NetToMojoPendingBuffer;
+
class TCPConnectedSocketImpl : public InterfaceImpl<TCPConnectedSocket> {
public:
TCPConnectedSocketImpl(scoped_ptr<net::TCPSocket> socket,
@@ -20,9 +25,35 @@
virtual ~TCPConnectedSocketImpl();
private:
+ // "Receiving" in this context means reading from TCPSocket and writing to
+ // the Mojo receive_stream.
+ void ReceiveMore();
+ void OnReceiveStreamReady(MojoResult result);
+ void DidReceive(bool completed_synchronously, int result);
+
+ // "Writing" is reading from the Mojo send_stream and writing to the
+ // TCPSocket.
+ void SendMore();
+ void OnSendStreamReady(MojoResult result);
+ void DidSend(bool completed_asynchronously, int result);
+
scoped_ptr<net::TCPSocket> socket_;
+
+ // The *stream handles will be null while there is an in-progress transation
+ // between net and mojo. During this time, the handle will be owned by the
+ // *PendingBuffer.
+
+ // For reading from the network and writing to Mojo pipe.
ScopedDataPipeConsumerHandle send_stream_;
+ common::HandleWatcher receive_handle_watcher_;
+ scoped_refptr<NetToMojoPendingBuffer> pending_receive_;
+
+ // For reading from the Mojo pipe and writing to the network.
ScopedDataPipeProducerHandle receive_stream_;
+ common::HandleWatcher send_handle_watcher_;
+ scoped_refptr<MojoToNetPendingBuffer> pending_send_;
+
+ base::WeakPtrFactory<TCPConnectedSocketImpl> weak_ptr_factory_;
};
} // namespace mojo
diff --git a/mojo/services/public/interfaces/network/network_service.mojom b/mojo/services/public/interfaces/network/network_service.mojom
index 74f9312..e039780 100644
--- a/mojo/services/public/interfaces/network/network_service.mojom
+++ b/mojo/services/public/interfaces/network/network_service.mojom
@@ -45,6 +45,11 @@
//
// If you want control over the local address and port, instead use
// CreateTCPBoundSocket.
+ //
+ // IMPORTANT: This does not work yet! We need to add a new parameter to
+ // indicate the protocol type (IPv4 or IPv6) actually be able to create the
+ // right type of socket. We also need to figure out how the client is supposed
+ // to decide between IPv4 and IPv6 on a given system.
CreateTCPConnectedSocket(NetAddress remote_address,
handle<data_pipe_consumer> send_stream,
handle<data_pipe_producer> receive_stream,
diff --git a/mojo/services/public/interfaces/network/tcp_server_socket.mojom b/mojo/services/public/interfaces/network/tcp_server_socket.mojom
index 997f7e8..6d8430d 100644
--- a/mojo/services/public/interfaces/network/tcp_server_socket.mojom
+++ b/mojo/services/public/interfaces/network/tcp_server_socket.mojom
@@ -14,6 +14,10 @@
// for connecting with the remote host. Only one Accept call can be pending
// at a time.
//
+ // Once a connection has been established (indicated by a successful
+ // callback), the TCPConnectedSocket may outlive the TCPServerSocket that
+ // created it.
+ //
// On success, the address of the remote host will be provided.
Accept(handle<data_pipe_consumer> send_stream,
handle<data_pipe_producer> receive_stream,
diff --git a/mojo/shell/context.cc b/mojo/shell/context.cc
index e63a709..5d1e135 100644
--- a/mojo/shell/context.cc
+++ b/mojo/shell/context.cc
@@ -233,7 +233,7 @@
scoped_ptr<ApplicationLoader>(new NetworkApplicationLoader()),
"network_service",
base::MessageLoop::TYPE_IO));
- application_manager_.SetLoaderForURL(loader.PassAs<ApplicationLoader>(),
+ application_manager_.SetLoaderForURL(loader.Pass(),
GURL("mojo:mojo_network_service"));
}
#endif
diff --git a/mojo/shell/external_application_listener_unittest.cc b/mojo/shell/external_application_listener_unittest.cc
index 6225dfd..7f675ae 100644
--- a/mojo/shell/external_application_listener_unittest.cc
+++ b/mojo/shell/external_application_listener_unittest.cc
@@ -175,8 +175,7 @@
connector->url(), loop, quit_callback));
// Since connectee won't be ready when connector is done registering, pass
// in a do-nothing callback.
- connector->Register(connector_app_impl.PassAs<InterfaceImpl<Application>>(),
- base::Bind(&NoOp));
+ connector->Register(connector_app_impl.Pass(), base::Bind(&NoOp));
// Connect the second app to the registrar.
connectee->ConnectSynchronously(socket_path);
@@ -186,7 +185,7 @@
// After connectee is successfully registered, connector should be
// able to connect to is by URL. Pass in a callback to attempt the
// app -> app connection.
- connectee->Register(connectee_app_impl.PassAs<InterfaceImpl<Application>>(),
+ connectee->Register(connectee_app_impl.Pass(),
base::Bind(&ConnectToApp, connector, connectee));
}
diff --git a/net/OWNERS b/net/OWNERS
index 973a2df..588dba6 100644
--- a/net/OWNERS
+++ b/net/OWNERS
@@ -15,7 +15,6 @@
rtenneti@chromium.org
rvargas@chromium.org
ttuttle@chromium.org
-willchan@chromium.org
per-file *.isolate=csharp@chromium.org
per-file *.isolate=maruel@chromium.org
@@ -24,3 +23,6 @@
# so he can continue to review some already in-progress
# work.
szym@chromium.org
+
+# On extended leave.
+willchan@chromium.org
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index 6d82d9e..2c72c3b 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -137,7 +137,7 @@
}
bool IsControlCharacter(unsigned char c) {
- return (c >= 0) && (c <= 31);
+ return c <= 31;
}
bool IsValidCookieAttributeValue(const std::string& value) {
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc
index dd3ee3d..ddb8a4c 100644
--- a/net/dns/dns_config_service_win.cc
+++ b/net/dns/dns_config_service_win.cc
@@ -23,8 +23,8 @@
#include "base/threading/non_thread_safe.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time.h"
-#include "base/win/object_watcher.h"
#include "base/win/registry.h"
+#include "base/win/scoped_handle.h"
#include "base/win/windows_version.h"
#include "net/base/net_util.h"
#include "net/base/network_change_notifier.h"
@@ -292,8 +292,7 @@
}
// Watches a single registry key for changes.
-class RegistryWatcher : public base::win::ObjectWatcher::Delegate,
- public base::NonThreadSafe {
+class RegistryWatcher : public base::NonThreadSafe {
public:
typedef base::Callback<void(bool succeeded)> CallbackType;
RegistryWatcher() {}
@@ -305,35 +304,31 @@
callback_ = callback;
if (key_.Open(HKEY_LOCAL_MACHINE, key, KEY_NOTIFY) != ERROR_SUCCESS)
return false;
- if (key_.StartWatching() != ERROR_SUCCESS)
- return false;
- if (!watcher_.StartWatching(key_.watch_event(), this))
- return false;
- return true;
+
+ return key_.StartWatching(base::Bind(&RegistryWatcher::OnObjectSignaled,
+ base::Unretained(this)));
}
- virtual void OnObjectSignaled(HANDLE object) override {
+ void OnObjectSignaled() {
// TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
tracked_objects::ScopedProfile tracking_profile(
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"RegistryWatcher_OnObjectSignaled"));
DCHECK(CalledOnValidThread());
- bool succeeded = (key_.StartWatching() == ERROR_SUCCESS) &&
- watcher_.StartWatching(key_.watch_event(), this);
- if (!succeeded && key_.Valid()) {
- watcher_.StopWatching();
- key_.StopWatching();
+ DCHECK(!callback_.is_null());
+ if (key_.StartWatching(base::Bind(&RegistryWatcher::OnObjectSignaled,
+ base::Unretained(this)))) {
+ callback_.Run(true);
+ } else {
key_.Close();
+ callback_.Run(false);
}
- if (!callback_.is_null())
- callback_.Run(succeeded);
}
private:
CallbackType callback_;
base::win::RegKey key_;
- base::win::ObjectWatcher watcher_;
DISALLOW_COPY_AND_ASSIGN(RegistryWatcher);
};
@@ -740,9 +735,8 @@
void DnsConfigServiceWin::OnConfigChanged(bool succeeded) {
InvalidateConfig();
- if (succeeded) {
- config_reader_->WorkNow();
- } else {
+ config_reader_->WorkNow();
+ if (!succeeded) {
LOG(ERROR) << "DNS config watch failed.";
set_watch_failed(true);
UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus",
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 5e0223a..4ffed82 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -1202,28 +1202,40 @@
return Time::FromUTCString(value.c_str(), result);
}
+// We accept the first value of "close" or "keep-alive" in a Connection or
+// Proxy-Connection header, in that order. Obeying "keep-alive" in HTTP/1.1 or
+// "close" in 1.0 is not strictly standards-compliant, but we'd like to
+// avoid looking at the Proxy-Connection header whenever it is reasonable to do
+// so.
+// TODO(ricea): Measure real-world usage of the "Proxy-Connection" header,
+// with a view to reducing support for it in order to make our Connection header
+// handling more RFC 7230 compliant.
bool HttpResponseHeaders::IsKeepAlive() const {
- if (http_version_ < HttpVersion(1, 0))
- return false;
-
// NOTE: It is perhaps risky to assume that a Proxy-Connection header is
// meaningful when we don't know that this response was from a proxy, but
// Mozilla also does this, so we'll do the same.
- std::string connection_val;
- if (!EnumerateHeader(NULL, "connection", &connection_val))
- EnumerateHeader(NULL, "proxy-connection", &connection_val);
+ static const char* kConnectionHeaders[] = {"connection", "proxy-connection"};
+ struct KeepAliveToken {
+ const char* token;
+ bool keep_alive;
+ };
+ static const KeepAliveToken kKeepAliveTokens[] = {{"keep-alive", true},
+ {"close", false}};
- bool keep_alive;
+ if (http_version_ < HttpVersion(1, 0))
+ return false;
- if (http_version_ == HttpVersion(1, 0)) {
- // HTTP/1.0 responses default to NOT keep-alive
- keep_alive = LowerCaseEqualsASCII(connection_val, "keep-alive");
- } else {
- // HTTP/1.1 responses default to keep-alive
- keep_alive = !LowerCaseEqualsASCII(connection_val, "close");
+ for (const char* header : kConnectionHeaders) {
+ void* iterator = nullptr;
+ std::string token;
+ while (EnumerateHeader(&iterator, header, &token)) {
+ for (const KeepAliveToken& keep_alive_token : kKeepAliveTokens) {
+ if (LowerCaseEqualsASCII(token, keep_alive_token.token))
+ return keep_alive_token.keep_alive;
+ }
+ }
}
-
- return keep_alive;
+ return http_version_ != HttpVersion(1, 0);
}
bool HttpResponseHeaders::HasStrongValidators() const {
diff --git a/net/http/http_response_headers_unittest.cc b/net/http/http_response_headers_unittest.cc
index c0e8598..7e4a6cf 100644
--- a/net/http/http_response_headers_unittest.cc
+++ b/net/http/http_response_headers_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include <algorithm>
+#include <iostream>
#include <limits>
#include "base/basictypes.h"
@@ -1640,6 +1641,14 @@
bool expected_keep_alive;
};
+// Enable GTest to print KeepAliveTestData in an intelligible way if the test
+// fails.
+void PrintTo(const KeepAliveTestData& keep_alive_test_data,
+ std::ostream* os) {
+ *os << "{\"" << keep_alive_test_data.headers << "\", " << std::boolalpha
+ << keep_alive_test_data.expected_keep_alive << "}";
+}
+
class IsKeepAliveTest
: public HttpResponseHeadersTest,
public ::testing::WithParamInterface<KeepAliveTestData> {
@@ -1714,6 +1723,82 @@
"proxy-connection: keep-alive\n",
true
},
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade, close\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade, keep-alive\n",
+ true
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade\n"
+ "Connection: close\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade\n"
+ "Connection: keep-alive\n",
+ true
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: close, Upgrade\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: keep-alive, Upgrade\n",
+ true
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade\n"
+ "Proxy-Connection: close\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: Upgrade\n"
+ "Proxy-Connection: keep-alive\n",
+ true
+ },
+ // In situations where the response headers conflict with themselves, use the
+ // first one for backwards-compatibility.
+ { "HTTP/1.1 200 OK\n"
+ "Connection: close\n"
+ "Connection: keep-alive\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Connection: keep-alive\n"
+ "Connection: close\n",
+ true
+ },
+ { "HTTP/1.0 200 OK\n"
+ "Connection: close\n"
+ "Connection: keep-alive\n",
+ false
+ },
+ { "HTTP/1.0 200 OK\n"
+ "Connection: keep-alive\n"
+ "Connection: close\n",
+ true
+ },
+ // Ignore the Proxy-Connection header if at all possible.
+ { "HTTP/1.0 200 OK\n"
+ "Proxy-Connection: keep-alive\n"
+ "Connection: close\n",
+ false
+ },
+ { "HTTP/1.1 200 OK\n"
+ "Proxy-Connection: close\n"
+ "Connection: keep-alive\n",
+ true
+ },
+ // Older versions of Chrome would have ignored Proxy-Connection in this case,
+ // but it doesn't seem safe.
+ { "HTTP/1.1 200 OK\n"
+ "Proxy-Connection: close\n"
+ "Connection: Transfer-Encoding\n",
+ false
+ },
};
INSTANTIATE_TEST_CASE_P(HttpResponseHeaders,
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index 4a60a6b..4c1041b 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -368,6 +368,11 @@
// The client callback can do anything, including destroying this class,
// so any pending callback must be issued after everything else is done.
if (result != ERR_IO_PENDING && !callback_.is_null()) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424359 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "424359 HttpStreamParser::OnIOComplete callback"));
+
CompletionCallback c = callback_;
callback_.Reset();
c.Run(result);
@@ -375,6 +380,10 @@
}
int HttpStreamParser::DoLoop(int result) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424359 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("424359 HttpStreamParser::DoLoop"));
+
do {
DCHECK_NE(ERR_IO_PENDING, result);
DCHECK_NE(STATE_DONE, io_state_);
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h
index edbe166..9ce215d 100644
--- a/net/http/transport_security_state_static.h
+++ b/net/http/transport_security_state_static.h
@@ -672,1368 +672,1412 @@
// value has the MSB set then it represents a literal leaf value. Otherwise
// it's a pointer to the n'th element of the array.
static const uint8 kHSTSHuffmanTree[] = {
- 0xf0, 0xf7, 0x00, 0xec, 0x01, 0x80, 0xb3, 0xb0,
- 0x03, 0xf1, 0xb4, 0x04, 0x05, 0xf8, 0xf6, 0x06,
- 0xeb, 0x07, 0xed, 0x08, 0xe1, 0x09, 0xe2, 0xe8,
- 0xe3, 0x0b, 0xe7, 0x0c, 0x0a, 0x0d, 0x02, 0x0e,
- 0xf3, 0xee, 0xb9, 0xb6, 0x11, 0xb7, 0xb5, 0x12,
- 0xb1, 0x13, 0x14, 0xb2, 0x15, 0xea, 0xfa, 0x16,
- 0x17, 0xe6, 0xf5, 0x18, 0xae, 0x19, 0x10, 0x1a,
- 0xff, 0x1b, 0xf4, 0xe9, 0xe5, 0x1d, 0xad, 0xf9,
- 0xe4, 0x1f, 0x20, 0xf2, 0x21, 0xef, 0x1e, 0x22,
- 0x1c, 0x23, 0x0f, 0x24,
+ 0xf0, 0xf7, 0x00, 0xec, 0x01, 0x80, 0xe1, 0xe7,
+ 0xb3, 0xb1, 0x04, 0xf1, 0xb4, 0x05, 0x06, 0xf8,
+ 0xf6, 0x07, 0xeb, 0x08, 0xed, 0x09, 0xe2, 0xe8,
+ 0xe3, 0x0b, 0x0a, 0x0c, 0x03, 0x0d, 0x02, 0x0e,
+ 0xf3, 0xae, 0xee, 0xf4, 0x10, 0x11, 0xff, 0x12,
+ 0xb9, 0xb6, 0x14, 0xb7, 0xb5, 0x15, 0xb0, 0x16,
+ 0x17, 0xb2, 0x18, 0xea, 0xfa, 0x19, 0x1a, 0xe6,
+ 0xf5, 0x1b, 0xad, 0xf9, 0xe4, 0x1d, 0x1c, 0x1e,
+ 0xe5, 0x1f, 0xe9, 0xf2, 0xef, 0x21, 0x20, 0x22,
+ 0x13, 0x23, 0x0f, 0x24,
};
static const uint8 kPreloadedHSTSData[] = {
- 0xfe, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x25, 0x9f,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x2d, 0x9b, 0x1f, 0x2a,
- 0x48, 0x54, 0x80, 0x26, 0x94, 0x02, 0xd3, 0xfb,
- 0x58, 0x20, 0x56, 0xe8, 0x55, 0x8d, 0x34, 0xfc,
- 0xea, 0xed, 0x76, 0x2c, 0x74, 0x21, 0xf9, 0x7a,
- 0x14, 0xad, 0x89, 0x86, 0xaf, 0xc3, 0xb6, 0x7f,
- 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x51, 0x4f, 0x85,
- 0xbf, 0xd8, 0xd1, 0x5e, 0xcf, 0xb7, 0x78, 0xd7,
- 0x3c, 0x74, 0xad, 0x87, 0xb8, 0x26, 0x13, 0xff,
- 0x5b, 0xdd, 0x6c, 0x16, 0xff, 0x63, 0x44, 0x8d,
- 0x3f, 0xfa, 0xca, 0xf7, 0x5b, 0x05, 0xbf, 0xd8,
- 0xd1, 0x3c, 0x4f, 0xfe, 0xb2, 0xbd, 0xd6, 0xc1,
- 0x6f, 0xf6, 0x34, 0x4f, 0xf3, 0xff, 0xac, 0xaf,
- 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x14, 0x34, 0xff,
- 0xeb, 0x2b, 0xdd, 0x6c, 0x16, 0xff, 0x63, 0x45,
- 0x11, 0x3f, 0xef, 0x75, 0xb0, 0x5b, 0xfd, 0x8d,
- 0x14, 0x8c, 0xff, 0xfd, 0x9c, 0x55, 0x39, 0xdb,
- 0x5d, 0xf0, 0x52, 0x88, 0x02, 0xa5, 0x65, 0x22,
- 0x8d, 0x7d, 0x1a, 0x7f, 0xeb, 0x7b, 0xad, 0x82,
- 0xdf, 0xec, 0x68, 0x94, 0x21, 0xe5, 0xce, 0x57,
- 0x46, 0x90, 0xc6, 0x23, 0x09, 0x75, 0x13, 0x55,
- 0x30, 0x0a, 0x4b, 0xda, 0x95, 0x14, 0xae, 0x87,
- 0xad, 0xe1, 0x64, 0xff, 0xeb, 0x2b, 0xdd, 0x6c,
- 0x16, 0xff, 0x63, 0x44, 0xe7, 0x3f, 0xfa, 0xca,
- 0xf7, 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x44, 0xcf,
- 0xfc, 0x2e, 0xb5, 0x77, 0x45, 0x9d, 0xb0, 0x1d,
- 0x02, 0x8e, 0xaa, 0x29, 0x5c, 0xa5, 0x3f, 0xad,
- 0x82, 0xdf, 0xec, 0x68, 0x87, 0x27, 0xc2, 0xdf,
- 0xec, 0x68, 0x8b, 0xe7, 0xdf, 0xa7, 0x25, 0xf2,
- 0xa5, 0x6c, 0x3d, 0x8e, 0x98, 0x4f, 0xfe, 0xb2,
- 0xbd, 0xd6, 0xc1, 0x6f, 0xf6, 0x34, 0x4c, 0x93,
- 0xfa, 0xd8, 0x2d, 0xfe, 0xc6, 0x8b, 0x7a, 0x7f,
- 0xf5, 0x95, 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2,
- 0x93, 0x84, 0x4e, 0x65, 0xd0, 0x93, 0xc2, 0x7a,
- 0x29, 0x2e, 0x3b, 0x9f, 0xd6, 0xc1, 0x6f, 0xf6,
- 0x34, 0x43, 0xb3, 0xff, 0xac, 0xaf, 0x75, 0xb0,
- 0x5b, 0xfd, 0x8d, 0x12, 0xc4, 0xfe, 0xb6, 0x0b,
- 0x7f, 0xb1, 0xa2, 0x30, 0x9f, 0xfa, 0xde, 0xeb,
- 0x60, 0xb7, 0xfb, 0x1a, 0x23, 0xd9, 0xfd, 0x6c,
- 0x16, 0xff, 0x63, 0x45, 0x87, 0x3f, 0xad, 0x82,
- 0xdf, 0xec, 0x68, 0xb9, 0xe1, 0x13, 0x8a, 0x78,
- 0xed, 0xca, 0x5b, 0x3b, 0x52, 0x66, 0x8e, 0xe7,
- 0xf5, 0xb0, 0x5b, 0xfd, 0x8d, 0x10, 0xf4, 0xf8,
- 0x5b, 0xfd, 0x8d, 0x11, 0x34, 0xda, 0x51, 0xd3,
- 0xff, 0xb2, 0xbc, 0xde, 0xa2, 0x6d, 0xfd, 0x22,
- 0x8e, 0x87, 0xcf, 0x8e, 0xa2, 0xd3, 0xda, 0xbb,
- 0xf9, 0x9a, 0x21, 0x79, 0x5b, 0x11, 0xcf, 0x48,
- 0x49, 0xdc, 0x47, 0x3d, 0xaa, 0xef, 0x47, 0x4f,
- 0xfe, 0xda, 0xce, 0xc7, 0xdd, 0xc9, 0x5f, 0xfd,
- 0x3a, 0x6f, 0xbc, 0x3a, 0x57, 0xae, 0x22, 0x1e,
- 0xa4, 0x5e, 0x9b, 0x3e, 0xaf, 0xeb, 0xdc, 0x74,
- 0xf6, 0xe9, 0xb0, 0x1d, 0x38, 0x21, 0x09, 0x53,
- 0xef, 0xee, 0xab, 0x85, 0x58, 0xbc, 0x9f, 0x7e,
- 0x96, 0xcd, 0x1d, 0x1c, 0x22, 0x68, 0x07, 0xdd,
- 0x35, 0x9f, 0xf8, 0x1b, 0x5b, 0x95, 0x53, 0x63,
- 0x75, 0xec, 0xe9, 0xff, 0x6e, 0xfa, 0x75, 0x28,
- 0x9b, 0x51, 0xd3, 0xf6, 0x2e, 0xb9, 0xd9, 0x43,
- 0xa7, 0xb3, 0x8c, 0x78, 0xe8, 0xc4, 0xf3, 0x77,
- 0x0c, 0x05, 0x8c, 0x6a, 0x99, 0xd3, 0xfd, 0x17,
- 0xcf, 0xd8, 0x14, 0xce, 0x36, 0x74, 0xff, 0xff,
- 0xee, 0xf5, 0xf4, 0xbf, 0xdc, 0xe2, 0xbb, 0x5b,
- 0x95, 0x31, 0xf7, 0x0e, 0x04, 0xe9, 0xf6, 0xf5,
- 0x72, 0x3c, 0x74, 0xfe, 0x7d, 0xd4, 0xbf, 0x72,
- 0x3e, 0x74, 0xfe, 0xf0, 0xdc, 0xb2, 0x6b, 0xce,
- 0x8d, 0x9f, 0x5f, 0x4e, 0x21, 0x13, 0x35, 0xc7,
- 0xf1, 0x84, 0xa4, 0xd7, 0x38, 0xe9, 0xdf, 0xaa,
- 0x1d, 0x35, 0xcf, 0x1d, 0x3c, 0x9d, 0xd2, 0xce,
- 0x36, 0x62, 0x37, 0x3f, 0xfe, 0xb9, 0x35, 0xcb,
- 0xb7, 0x5e, 0x72, 0xcd, 0x2f, 0xe6, 0x8e, 0x9f,
- 0xfa, 0xa9, 0x7f, 0x96, 0xbb, 0xfa, 0x4d, 0x1d,
- 0x3f, 0xb9, 0x3e, 0xed, 0xd6, 0xe5, 0x1d, 0x00,
- 0x3f, 0xfe, 0xa3, 0xcf, 0xf8, 0x56, 0xe5, 0x44,
- 0xdb, 0xdf, 0xa3, 0xa1, 0x0f, 0x8e, 0xe2, 0x29,
- 0xff, 0xff, 0xeb, 0xbb, 0x41, 0xea, 0x2d, 0xcb,
- 0x9e, 0xb6, 0xec, 0x7f, 0x58, 0xbb, 0xb9, 0x43,
- 0xa4, 0x87, 0x4f, 0xe7, 0x78, 0xee, 0x88, 0xf9,
- 0xd3, 0xff, 0xff, 0xfb, 0x60, 0xa7, 0x73, 0xdf,
- 0xe5, 0xc5, 0x6e, 0xe5, 0xdc, 0x7d, 0xd9, 0x73,
- 0xdd, 0xcf, 0x7c, 0xe9, 0xdf, 0xec, 0x68, 0xa6,
- 0x23, 0x11, 0x7e, 0xd0, 0x99, 0x9f, 0xf6, 0x75,
- 0xf7, 0x53, 0x48, 0x2b, 0x1d, 0x3e, 0x7f, 0xb8,
- 0xbb, 0x0e, 0x8d, 0x9f, 0x47, 0x9f, 0xcf, 0xf7,
- 0xab, 0x8a, 0xa3, 0xd8, 0x13, 0xa7, 0xff, 0xf7,
- 0x71, 0xb5, 0xa4, 0xd5, 0x16, 0xee, 0x07, 0x92,
- 0x5e, 0x83, 0xa7, 0xfc, 0xc8, 0xaa, 0xe5, 0x33,
- 0x7d, 0x3a, 0x11, 0x14, 0x95, 0x68, 0x9f, 0x0a,
- 0x2e, 0x41, 0x3a, 0x7e, 0xfe, 0xf2, 0xe1, 0x3a,
- 0x74, 0x61, 0xfb, 0xec, 0x8a, 0xe2, 0x68, 0x79,
- 0x76, 0x7f, 0x84, 0xab, 0xe7, 0x0d, 0x1a, 0x1b,
- 0xe4, 0x5b, 0x84, 0x32, 0xc1, 0xe3, 0x0f, 0x15,
- 0x42, 0x3b, 0xa4, 0x3a, 0x8d, 0x52, 0x7b, 0x3b,
- 0x7e, 0xf6, 0x74, 0xff, 0xff, 0xfa, 0xbb, 0xd5,
- 0x70, 0x51, 0x77, 0x25, 0x5d, 0x79, 0xcb, 0x1f,
- 0x76, 0x5d, 0xd0, 0x50, 0xe9, 0x6b, 0x68, 0xb6,
- 0xa1, 0x3c, 0xff, 0xfb, 0x32, 0xbb, 0x6a, 0xe7,
- 0x2a, 0x5d, 0x54, 0xbd, 0x9d, 0x3f, 0xf5, 0x3d,
- 0xfe, 0x4a, 0x4c, 0xee, 0x97, 0xce, 0x96, 0xfa,
- 0x8a, 0x3d, 0x2d, 0x4f, 0x9c, 0x8f, 0xba, 0x87,
- 0x4f, 0xff, 0xff, 0xfb, 0x3b, 0x7f, 0x96, 0xeb,
- 0x75, 0x96, 0xde, 0x91, 0x5d, 0xfb, 0xf5, 0xdd,
- 0xb2, 0xaf, 0x81, 0x38, 0x2a, 0x7f, 0xff, 0xe6,
- 0xd8, 0x78, 0xb8, 0x79, 0x5c, 0x8f, 0x51, 0xab,
- 0x75, 0x5f, 0xf0, 0x9d, 0x35, 0xcf, 0x3e, 0x9a,
- 0x36, 0xca, 0x29, 0x0a, 0x58, 0x45, 0x50, 0x15,
- 0x86, 0x67, 0x63, 0x6f, 0x9f, 0xfc, 0xa6, 0xe5,
- 0x5f, 0x76, 0x2b, 0xfa, 0x03, 0xa7, 0xff, 0xdb,
- 0xee, 0xab, 0x97, 0x9a, 0x5b, 0x2f, 0x7f, 0xd0,
- 0x1d, 0x3f, 0xf2, 0x75, 0xee, 0xe2, 0xea, 0x5c,
- 0x8f, 0x9d, 0x14, 0x45, 0x2d, 0xcb, 0xb3, 0xd9,
- 0xac, 0x5e, 0xce, 0x9c, 0xbf, 0x95, 0x3a, 0x6c,
- 0xe0, 0xe8, 0x79, 0x36, 0xc7, 0x43, 0xbe, 0x84,
- 0x9a, 0x25, 0x5c, 0x3d, 0x3f, 0x70, 0x9d, 0xaf,
- 0xb8, 0xe9, 0xc9, 0xc2, 0x1d, 0x3f, 0x96, 0x76,
- 0x6a, 0x9e, 0xb7, 0x23, 0xc8, 0x51, 0x6c, 0xfd,
- 0x79, 0x5f, 0xbd, 0xa0, 0x0e, 0x9f, 0xc2, 0xb7,
- 0x72, 0xbf, 0xa3, 0xa3, 0x0f, 0x97, 0x66, 0x73,
- 0xf2, 0x03, 0x35, 0xcd, 0xe3, 0xa1, 0xc7, 0xa1,
- 0xd2, 0x19, 0xff, 0xff, 0x6b, 0xbe, 0x0a, 0x3d,
- 0x9b, 0xee, 0xbb, 0x8b, 0xb9, 0x50, 0x3d, 0x3a,
- 0x7f, 0xdb, 0xc5, 0xb9, 0x51, 0x2b, 0xf7, 0xb3,
- 0xa7, 0xf7, 0xbf, 0x4a, 0xe7, 0x89, 0xd1, 0xc1,
- 0xfa, 0xe9, 0x12, 0x4a, 0x3a, 0x77, 0x73, 0x83,
- 0xa1, 0x0d, 0x63, 0xe2, 0x13, 0xf3, 0xf4, 0xcc,
- 0xed, 0xf3, 0xa7, 0x95, 0xcd, 0x00, 0x74, 0x61,
- 0xe9, 0x6c, 0xbe, 0x11, 0x3c, 0xac, 0x87, 0x3e,
- 0xd3, 0xc5, 0xce, 0x7f, 0x6b, 0x6f, 0x65, 0x6e,
- 0xd1, 0xd3, 0xd8, 0xfa, 0x2c, 0x74, 0xfd, 0x5f,
- 0x72, 0x87, 0x67, 0x4f, 0xb6, 0x01, 0xc7, 0xce,
- 0x8b, 0xe8, 0xaa, 0xd9, 0xa8, 0x08, 0xae, 0x2c,
- 0x9f, 0xff, 0x85, 0xd5, 0xc5, 0xaa, 0x9d, 0xbf,
- 0xdc, 0xd5, 0x6e, 0x3a, 0x7f, 0xff, 0x6f, 0x1f,
- 0x75, 0x35, 0x54, 0x52, 0x6f, 0x8e, 0x49, 0x7a,
- 0x0e, 0x9f, 0xff, 0xff, 0x5d, 0xde, 0x41, 0xf7,
- 0xdc, 0x3e, 0x0e, 0x54, 0xb9, 0x1f, 0xae, 0x6f,
- 0xb9, 0x7c, 0xe9, 0xff, 0xf5, 0xc2, 0x39, 0xaa,
- 0x57, 0x79, 0xca, 0xa0, 0x43, 0xa3, 0x11, 0xc5,
- 0x58, 0x46, 0x4f, 0xff, 0x3a, 0xf2, 0xb8, 0x9d,
- 0x5b, 0xb9, 0xaa, 0x79, 0xd3, 0xff, 0xee, 0x31,
- 0x5c, 0xaf, 0x34, 0x94, 0x59, 0xde, 0x2f, 0x1d,
- 0x3f, 0xd9, 0xd7, 0xb9, 0x03, 0xfd, 0x63, 0xa7,
- 0xfd, 0x4b, 0xbb, 0xca, 0x97, 0x2f, 0xdc, 0x27,
- 0x4f, 0xfe, 0x7b, 0x95, 0x2b, 0x77, 0x2d, 0x52,
- 0x88, 0x27, 0x4f, 0xff, 0xfb, 0x1f, 0xa6, 0xf0,
- 0x3c, 0xab, 0x9a, 0xa6, 0x3d, 0xcb, 0x37, 0xc1,
- 0xd1, 0x88, 0xc2, 0xda, 0x84, 0x3c, 0xae, 0x1d,
- 0xa3, 0x4c, 0x7c, 0x9f, 0x6a, 0x4a, 0x5c, 0xa1,
- 0xde, 0xa3, 0x09, 0x9f, 0xf7, 0x8d, 0x73, 0x49,
- 0xdd, 0x80, 0xe9, 0xfe, 0xc0, 0xbe, 0xea, 0x72,
- 0xd6, 0xce, 0x9f, 0xff, 0xf2, 0x32, 0x2b, 0x92,
- 0xd5, 0xdf, 0x78, 0xe5, 0xcd, 0xbb, 0x95, 0xc3,
- 0xa1, 0x91, 0xd5, 0xd3, 0xcb, 0xc3, 0xc9, 0xed,
- 0xeb, 0x68, 0x74, 0xff, 0xff, 0xfd, 0xa4, 0x57,
- 0x77, 0x7e, 0xbe, 0xb7, 0x2e, 0xdd, 0x79, 0xcb,
- 0x1f, 0x76, 0x5d, 0xd0, 0x50, 0xe8, 0x72, 0x2e,
- 0x36, 0x43, 0x08, 0xbc, 0x9f, 0x92, 0xf9, 0x77,
- 0x1a, 0xef, 0xc3, 0xaa, 0x7b, 0x54, 0xf0, 0x1d,
- 0x3f, 0xf5, 0x77, 0xcb, 0x63, 0x73, 0xde, 0x2c,
- 0x74, 0xfd, 0xaf, 0x1e, 0xbf, 0xb3, 0xa3, 0x11,
- 0x29, 0x7c, 0x87, 0x48, 0xd3, 0xdc, 0xee, 0xfa,
- 0x1d, 0x3f, 0xff, 0x6c, 0x79, 0x66, 0xf3, 0xb7,
- 0xeb, 0xbc, 0x56, 0x31, 0xd3, 0xff, 0xfd, 0xb7,
- 0x85, 0x15, 0x4b, 0x93, 0x92, 0x0a, 0x71, 0x54,
- 0x51, 0xd1, 0x88, 0xc4, 0x15, 0xc9, 0xff, 0xff,
- 0xc2, 0x3b, 0x7b, 0x95, 0x73, 0x5d, 0x45, 0xab,
- 0x8f, 0x23, 0xfa, 0xb9, 0x8e, 0x9f, 0xff, 0xf9,
- 0x2f, 0xd5, 0x39, 0x77, 0x2e, 0xbf, 0xc9, 0xf7,
- 0x53, 0x7d, 0xe6, 0x8f, 0x1d, 0x3e, 0x7e, 0x9b,
- 0xce, 0x9d, 0x18, 0x8a, 0x7b, 0x9f, 0xe3, 0x69,
- 0xa3, 0x56, 0x32, 0x39, 0xfe, 0xed, 0xcb, 0x77,
- 0x2b, 0xfa, 0x3a, 0x7f, 0xb8, 0xaa, 0x07, 0x8a,
- 0xfa, 0x8e, 0x9f, 0xff, 0xef, 0x1a, 0xe6, 0xb7,
- 0x9d, 0x7a, 0x89, 0x9d, 0xe2, 0xa8, 0x74, 0xf6,
- 0xb9, 0x3c, 0x27, 0x43, 0xe8, 0x89, 0xf6, 0x59,
- 0xf9, 0x67, 0xdd, 0x72, 0x68, 0xe9, 0xfe, 0xaf,
- 0xab, 0xb9, 0x5f, 0xd1, 0xd0, 0x87, 0xcf, 0x43,
- 0x09, 0xfb, 0x34, 0x23, 0x8e, 0x3a, 0x7e, 0xee,
- 0x57, 0xb8, 0xc7, 0x4f, 0x77, 0x29, 0xc9, 0x63,
- 0xd5, 0xd1, 0x54, 0x70, 0xaf, 0x29, 0xa3, 0x67,
- 0xd9, 0x50, 0x9d, 0x56, 0x18, 0x7a, 0x84, 0x52,
- 0xe7, 0x69, 0xff, 0xbb, 0xdc, 0xe4, 0x39, 0x5e,
- 0xe2, 0xc7, 0x42, 0x2e, 0xb7, 0x64, 0xe5, 0x97,
- 0xbb, 0xcf, 0xba, 0x8a, 0xfe, 0x0e, 0x9f, 0xd8,
- 0xb5, 0x73, 0x49, 0xc1, 0xd3, 0xff, 0xff, 0xd5,
- 0xcd, 0x53, 0xd6, 0xe5, 0xdc, 0x7d, 0xd9, 0x73,
- 0xdd, 0xce, 0x2b, 0xb5, 0x8e, 0x9a, 0xeb, 0xe7,
- 0x40, 0xa2, 0x7b, 0x50, 0x85, 0x9f, 0xb1, 0xee,
- 0xe3, 0xf4, 0x3a, 0x7f, 0xf0, 0xbe, 0xea, 0x62,
- 0x9f, 0x4a, 0xd5, 0x0e, 0x95, 0x0e, 0x8b, 0x8f,
- 0x6b, 0x9a, 0x54, 0xfe, 0x45, 0x77, 0x2b, 0xfa,
- 0x3a, 0x7f, 0xff, 0xda, 0xea, 0x01, 0xf7, 0x52,
- 0xe4, 0xd7, 0x73, 0x8d, 0xe0, 0xac, 0x74, 0x6d,
- 0x53, 0x62, 0xc4, 0xff, 0x0d, 0x1e, 0x93, 0xd2,
- 0x11, 0x17, 0x12, 0xf3, 0x31, 0x9f, 0x3b, 0x63,
- 0x8f, 0x9d, 0x3e, 0xca, 0x3d, 0x81, 0x3a, 0x1f,
- 0x3c, 0xea, 0x93, 0xcf, 0xff, 0xb6, 0xf6, 0x37,
- 0x15, 0xde, 0x5f, 0xe5, 0x7e, 0xe4, 0x3a, 0x7a,
- 0xf3, 0x59, 0x53, 0xa7, 0xff, 0xfe, 0xbc, 0x7d,
- 0xde, 0xff, 0x2e, 0xdd, 0x79, 0xcb, 0x1f, 0x76,
- 0x5d, 0xd0, 0x50, 0xe8, 0x79, 0x14, 0xd8, 0x49,
- 0x3f, 0xff, 0xfe, 0x47, 0xe9, 0x72, 0x3f, 0xca,
- 0xb9, 0xc7, 0x2e, 0xe5, 0xd7, 0xf9, 0x50, 0x00,
- 0xde, 0x8e, 0x9f, 0x27, 0x5f, 0xf7, 0x8e, 0x9f,
- 0xff, 0xff, 0xfd, 0x8a, 0xc6, 0x4a, 0xa2, 0xb5,
- 0x94, 0xa2, 0x08, 0xa7, 0x71, 0xec, 0xba, 0x97,
- 0x2d, 0xd4, 0x51, 0xd3, 0xfc, 0x0c, 0xe3, 0xb9,
- 0x5f, 0xd1, 0xd3, 0xff, 0x3e, 0x97, 0xef, 0x2e,
- 0xce, 0xad, 0xcd, 0x47, 0x4f, 0xff, 0x66, 0xb8,
- 0xcc, 0x05, 0x39, 0x0d, 0x38, 0xa1, 0xd0, 0x8a,
- 0xdf, 0x70, 0x8f, 0x71, 0x81, 0x89, 0x1a, 0xa1,
- 0x23, 0x52, 0x8f, 0x85, 0x1f, 0x4e, 0x28, 0x9d,
- 0x3b, 0x8e, 0x4b, 0x1d, 0x3f, 0xfc, 0xfb, 0xba,
- 0x9c, 0x95, 0xd4, 0xbf, 0xad, 0xbc, 0x74, 0x61,
- 0xfb, 0x6c, 0x82, 0x7e, 0x79, 0x67, 0x2f, 0x05,
- 0xe3, 0xa7, 0xca, 0xdf, 0x19, 0xc1, 0xd2, 0x58,
- 0xe9, 0x91, 0x47, 0x4b, 0x47, 0x40, 0x9a, 0x5f,
- 0x15, 0x8e, 0x0f, 0x56, 0xa6, 0xd3, 0xda, 0xa7,
- 0xbe, 0x74, 0xcb, 0x79, 0xd3, 0xfa, 0xbb, 0x17,
- 0xdd, 0xd4, 0x3a, 0x17, 0xaa, 0x68, 0x08, 0x69,
- 0x8f, 0xdb, 0x23, 0x51, 0x15, 0xc2, 0xd3, 0xfa,
- 0x9b, 0x7c, 0x3f, 0xd0, 0x1d, 0x3f, 0xfe, 0x41,
- 0x46, 0xc5, 0x23, 0x3b, 0x74, 0xb9, 0x47, 0x42,
- 0xc8, 0x86, 0x5f, 0x34, 0x9d, 0xd0, 0x21, 0xd2,
- 0xb2, 0xf1, 0xd5, 0x8e, 0xa4, 0xa0, 0x67, 0x97,
- 0x78, 0x8d, 0x87, 0x27, 0x74, 0x9a, 0x5f, 0x83,
- 0xf1, 0xd4, 0x6e, 0x13, 0x6b, 0x46, 0x06, 0x31,
- 0xf6, 0x2a, 0x1d, 0x55, 0x9e, 0x8f, 0xf8, 0x71,
- 0xf6, 0x76, 0x7e, 0x92, 0xa9, 0x35, 0x38, 0x7c,
- 0xba, 0x30, 0x25, 0xf8, 0xd8, 0x79, 0xc3, 0x8e,
- 0xf0, 0x9e, 0x7f, 0x5b, 0x05, 0xbf, 0xd8, 0xd1,
- 0x4e, 0xcf, 0x85, 0xbf, 0xd8, 0xd1, 0x51, 0xcf,
- 0xfb, 0xdd, 0x6c, 0x16, 0xff, 0x63, 0x44, 0xd1,
- 0x2b, 0x61, 0xfb, 0x28, 0xc2, 0x7f, 0x5b, 0x05,
- 0xbf, 0xd8, 0xd1, 0x57, 0xcf, 0x85, 0xbf, 0xd8,
- 0xd1, 0x5b, 0x4f, 0xf3, 0xad, 0x82, 0xdf, 0xec,
- 0x68, 0x90, 0x65, 0x6c, 0x3f, 0x1f, 0x30, 0x9f,
- 0xfa, 0xde, 0xeb, 0x60, 0xb7, 0xfb, 0x1a, 0x24,
- 0x39, 0xf0, 0xb7, 0xfb, 0x1a, 0x2c, 0x49, 0xff,
- 0x93, 0x29, 0x9d, 0xe3, 0x60, 0x4e, 0x9d, 0x3b,
- 0xa8, 0xf1, 0xd2, 0x77, 0x4f, 0x7e, 0xe4, 0x39,
- 0xcb, 0xfb, 0x01, 0xd3, 0xef, 0x77, 0x3a, 0xa1,
- 0xd3, 0xf5, 0x28, 0x3b, 0x0d, 0xec, 0xe8, 0xd9,
- 0xec, 0xf9, 0x44, 0xfe, 0x02, 0x66, 0xb7, 0xd0,
- 0x95, 0x18, 0x9c, 0x1b, 0xf0, 0x8f, 0xd9, 0x4d,
- 0x5e, 0x00, 0x43, 0x3f, 0xf5, 0x76, 0x9a, 0xaf,
- 0xdf, 0xce, 0x80, 0xe9, 0xff, 0xfd, 0xad, 0x7b,
- 0xa9, 0x9d, 0x45, 0x7e, 0x6b, 0x48, 0xa3, 0xa7,
- 0xff, 0xb1, 0xf7, 0x6a, 0xe7, 0xad, 0x5f, 0x56,
- 0xe8, 0x74, 0xd5, 0xb6, 0x23, 0xdb, 0x68, 0xbd,
- 0x5e, 0x8b, 0x27, 0x02, 0x91, 0xa3, 0x4f, 0xeb,
- 0x60, 0xb7, 0xfb, 0x1a, 0x2c, 0xd9, 0xff, 0xd6,
- 0x57, 0xba, 0xd8, 0x2d, 0xfe, 0xc6, 0x8a, 0x02,
- 0x6e, 0x54, 0x3a, 0x79, 0xbf, 0xd8, 0xd1, 0x6f,
- 0xcf, 0xdc, 0xf5, 0xed, 0xe2, 0x74, 0x09, 0xeb,
- 0x80, 0xae, 0x7d, 0xa7, 0x53, 0x9d, 0x0e, 0x9f,
- 0xc8, 0xbb, 0x9e, 0xba, 0x80, 0x3a, 0x77, 0x71,
- 0xc7, 0x4a, 0xce, 0x4c, 0x2f, 0x1b, 0xc4, 0x86,
- 0xa5, 0x5a, 0x36, 0x9f, 0xf7, 0xba, 0xd8, 0x2d,
- 0xfe, 0xc6, 0x8a, 0x52, 0x7f, 0x9d, 0x6c, 0x16,
- 0xff, 0x63, 0x44, 0x9d, 0x2b, 0x29, 0x10, 0xfe,
- 0x8d, 0x08, 0xed, 0x93, 0x5e, 0x8c, 0x8b, 0x8b,
- 0x57, 0xbf, 0x91, 0xc9, 0xb4, 0x2c, 0x76, 0x4f,
- 0x7b, 0x85, 0x62, 0xc4, 0xca, 0x96, 0xa1, 0x52,
- 0x90, 0x1d, 0xd2, 0x35, 0xd5, 0xd0, 0xd6, 0x9f,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x1f, 0x9f, 0xf7, 0xba,
- 0xd8, 0x2d, 0xfe, 0xc6, 0x89, 0x4e, 0x56, 0xc3,
- 0xf6, 0x51, 0x84, 0xfe, 0xb6, 0x0b, 0x7f, 0xb1,
- 0xa2, 0x27, 0x9f, 0xd6, 0xc1, 0x6f, 0xf6, 0x34,
- 0x46, 0x33, 0xff, 0xac, 0xaf, 0x75, 0xb0, 0x5b,
- 0xfd, 0x8d, 0x13, 0xcc, 0x22, 0x3b, 0xde, 0x27,
- 0x71, 0xdd, 0x4e, 0xe7, 0xc2, 0xdf, 0xec, 0x68,
- 0x88, 0x27, 0xfd, 0xee, 0xb6, 0x0b, 0x7f, 0xb1,
- 0xa2, 0x54, 0x95, 0xb0, 0xfd, 0x94, 0x61, 0x3f,
- 0xad, 0x82, 0xdf, 0xec, 0x68, 0x8a, 0x27, 0xf5,
- 0xb0, 0x5b, 0xfd, 0x8d, 0x11, 0x94, 0xff, 0xeb,
- 0x2b, 0xdd, 0x6c, 0x16, 0xff, 0x63, 0x44, 0xcb,
- 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0xa9, 0x27,
- 0xf5, 0xb0, 0x5b, 0xfd, 0x8d, 0x15, 0xd4, 0xfe,
- 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0xc5, 0x9f, 0xf9,
- 0x5e, 0xeb, 0x60, 0xb7, 0xfb, 0x1a, 0x27, 0xa9,
- 0xfe, 0x0d, 0xbd, 0x36, 0xbf, 0xbb, 0xc3, 0xa2,
- 0xc8, 0x8a, 0x44, 0xc9, 0xfa, 0xf4, 0xf9, 0xad,
- 0xdd, 0x43, 0xa7, 0x85, 0x5a, 0x7c, 0xe9, 0xcd,
- 0x95, 0x2a, 0x7f, 0xfe, 0xaf, 0x7e, 0xfe, 0xc5,
- 0x1c, 0xec, 0xa0, 0x00, 0x87, 0x4f, 0xff, 0xc3,
- 0xbb, 0xcf, 0x55, 0x90, 0x47, 0x77, 0x8d, 0x73,
- 0xc7, 0x4f, 0x9b, 0x75, 0xe6, 0xa3, 0xa7, 0xff,
- 0x7d, 0x3b, 0x80, 0xb5, 0x76, 0xde, 0x27, 0x4f,
- 0xb5, 0x54, 0x53, 0x1d, 0x3f, 0xfb, 0xbc, 0x91,
- 0x3a, 0x8a, 0xe5, 0xca, 0xab, 0xe7, 0x4f, 0xf5,
- 0xdf, 0x4f, 0xad, 0xdd, 0x78, 0xe8, 0xda, 0x7b,
- 0xc2, 0xb6, 0xa6, 0x0a, 0x94, 0xf5, 0x1f, 0x44,
- 0xd7, 0x8a, 0x53, 0xbb, 0xfa, 0x35, 0x42, 0xd3,
- 0xbb, 0xba, 0x1d, 0x20, 0xde, 0xa7, 0x88, 0x85,
- 0x13, 0xc2, 0xbb, 0xd4, 0x74, 0x61, 0xe7, 0x6c,
- 0xb2, 0x7f, 0xdb, 0xaf, 0xe9, 0x16, 0xa6, 0xd4,
- 0x74, 0xfd, 0xbe, 0xdf, 0xde, 0x50, 0xe9, 0xee,
- 0xf1, 0xca, 0xf9, 0xd3, 0xf6, 0x50, 0x3f, 0xd7,
- 0x8e, 0x8f, 0x3d, 0x4e, 0x93, 0xcf, 0xae, 0xbf,
- 0x4e, 0x10, 0xe8, 0xc4, 0x67, 0xee, 0x10, 0x75,
- 0x21, 0x9f, 0xff, 0xfd, 0x54, 0xd8, 0x8a, 0x73,
- 0xd6, 0xfb, 0x73, 0xb2, 0x9c, 0x5d, 0xe2, 0xe3,
- 0xa7, 0xcf, 0x70, 0x3b, 0x09, 0xd3, 0xf7, 0x1e,
- 0x20, 0x5f, 0xc3, 0xa7, 0xfd, 0xdd, 0xbb, 0x55,
- 0xc1, 0xdd, 0x0e, 0x9f, 0xf7, 0xe0, 0x13, 0xbf,
- 0xc6, 0x5f, 0x3a, 0x1c, 0x7f, 0x80, 0x3e, 0x9e,
- 0xba, 0x95, 0x51, 0xd3, 0xf5, 0xd4, 0xd5, 0x33,
- 0x47, 0x4e, 0x08, 0x42, 0x54, 0xff, 0xed, 0x6f,
- 0x54, 0xae, 0xd7, 0xf9, 0x8a, 0x38, 0xab, 0x17,
- 0x91, 0xb4, 0x54, 0x5c, 0x95, 0x0e, 0x54, 0xbf,
- 0x8f, 0x5b, 0x29, 0x18, 0x55, 0xf4, 0x8b, 0x50,
- 0xcb, 0x9a, 0xfe, 0x1d, 0x3e, 0x0e, 0x91, 0xf0,
- 0x9d, 0x3f, 0x93, 0xc6, 0xa1, 0xfe, 0x0a, 0x98,
- 0x21, 0x2a, 0x38, 0x3c, 0x70, 0x98, 0xcf, 0x53,
- 0x5b, 0xbd, 0x95, 0x63, 0x47, 0x3f, 0xfa, 0xea,
- 0x53, 0x8e, 0xa7, 0x15, 0x4d, 0x50, 0xe9, 0xff,
- 0x6b, 0x63, 0xe0, 0xbc, 0xd6, 0x54, 0xe8, 0x72,
- 0x23, 0x76, 0x9b, 0x3e, 0xc7, 0xb3, 0x62, 0x74,
- 0xfd, 0xa4, 0x1e, 0x33, 0xa7, 0x4f, 0xee, 0x2a,
- 0x9d, 0x0f, 0xbe, 0x74, 0xff, 0xff, 0xb6, 0xaf,
- 0xeb, 0xee, 0xb0, 0x73, 0x6b, 0xb3, 0xb9, 0xc7,
- 0xb8, 0xf1, 0x7a, 0xc2, 0x23, 0x73, 0xcb, 0x2e,
- 0x34, 0x9f, 0xfe, 0xcd, 0x53, 0x16, 0xaa, 0x2e,
- 0xca, 0xd5, 0x0e, 0x9f, 0xff, 0xff, 0x6f, 0x1f,
- 0xa6, 0xf0, 0x3c, 0xb1, 0xf7, 0x53, 0x7a, 0xa6,
- 0xdf, 0xe3, 0x8b, 0x9e, 0x3a, 0x3a, 0x8d, 0xed,
- 0x28, 0x4d, 0xb0, 0x9d, 0x37, 0x30, 0x1d, 0x0b,
- 0x1a, 0xe0, 0x0b, 0x4e, 0x77, 0xf0, 0x74, 0xc1,
- 0x09, 0xd1, 0xb3, 0xd4, 0xa1, 0x10, 0x47, 0x27,
- 0x6b, 0x98, 0x0a, 0xb1, 0xaf, 0x9f, 0xff, 0xfd,
- 0xa4, 0xe2, 0xb7, 0x7d, 0xf5, 0x7f, 0x19, 0x9d,
- 0xbf, 0x4a, 0x67, 0x40, 0x74, 0x3e, 0x8a, 0xbd,
- 0x97, 0x4f, 0xf6, 0x6a, 0xa8, 0x3a, 0xc6, 0x3a,
- 0x72, 0x0a, 0xc7, 0x46, 0x27, 0xe7, 0xf1, 0xbf,
- 0xf4, 0x91, 0x7c, 0xd6, 0x7d, 0xdc, 0xd7, 0xde,
- 0x1d, 0x3f, 0xf6, 0x08, 0xe2, 0xd5, 0xca, 0x7f,
- 0x4e, 0x9f, 0xdd, 0x41, 0xb9, 0xaa, 0x87, 0x4f,
- 0xb7, 0x7e, 0xbe, 0xe3, 0xa7, 0xed, 0xa2, 0x9e,
- 0xc0, 0x9d, 0x30, 0x42, 0x74, 0x31, 0xf6, 0x09,
- 0x48, 0x4b, 0x67, 0xfb, 0x16, 0xf5, 0xbd, 0xf7,
- 0x50, 0xab, 0x1a, 0xd9, 0xff, 0xd9, 0xd0, 0x65,
- 0x76, 0xfd, 0x2b, 0x75, 0x0e, 0x9f, 0xbb, 0xe0,
- 0xe3, 0x3a, 0x74, 0xe0, 0x84, 0x25, 0x4f, 0xfc,
- 0x83, 0xdb, 0xbf, 0x9e, 0x2c, 0x8a, 0x3a, 0xc5,
- 0xe4, 0x5e, 0xd3, 0xfd, 0x5a, 0x19, 0x54, 0x4a,
- 0xd2, 0x60, 0x52, 0x67, 0x78, 0xbc, 0x79, 0x04,
- 0xa7, 0x9d, 0x8f, 0xb8, 0xf2, 0x09, 0x4e, 0xa6,
- 0xf8, 0x3c, 0x82, 0x53, 0x04, 0x27, 0x90, 0x4a,
- 0x19, 0x14, 0x8b, 0x14, 0x68, 0xbc, 0x25, 0x53,
- 0xf7, 0xf4, 0x1d, 0xfd, 0x16, 0x41, 0x2b, 0x1b,
- 0xd9, 0xe5, 0xfc, 0xfa, 0x9d, 0x2c, 0xbd, 0x9f,
- 0x60, 0x12, 0x67, 0xf2, 0xce, 0xb9, 0xed, 0x6d,
- 0xe2, 0xa7, 0xf6, 0xdd, 0x77, 0xd2, 0xbb, 0x3a,
- 0x4e, 0x2a, 0x77, 0x8b, 0xc5, 0x41, 0x50, 0x86,
- 0xd5, 0x84, 0x14, 0x37, 0x3d, 0xd4, 0x03, 0x15,
- 0x63, 0x59, 0x08, 0x8c, 0x5c, 0x84, 0xac, 0xf5,
- 0xde, 0x2e, 0x3a, 0x4a, 0x3a, 0x6c, 0x77, 0x06,
- 0xc5, 0x62, 0x19, 0xf0, 0x71, 0x6d, 0xa8, 0xe9,
- 0xf9, 0x91, 0x67, 0x20, 0x0a, 0x96, 0xce, 0x9f,
- 0xe7, 0xae, 0x77, 0x15, 0xbb, 0xfa, 0x74, 0xfd,
- 0xb4, 0x53, 0xd8, 0x13, 0xa7, 0xd8, 0xf2, 0xb1,
- 0x47, 0x4e, 0xa6, 0xc4, 0xe8, 0xe9, 0xe1, 0x68,
- 0x9e, 0x7e, 0xef, 0x80, 0x17, 0x50, 0xe9, 0xfb,
- 0x77, 0xf9, 0xa2, 0xad, 0xc2, 0x61, 0x98, 0x20,
- 0x27, 0xb4, 0x6f, 0xd1, 0x14, 0x62, 0x7a, 0x3b,
- 0x28, 0xec, 0x67, 0x13, 0xdd, 0xc7, 0xae, 0x3a,
- 0x1c, 0xaf, 0x5f, 0x0a, 0xeb, 0x0f, 0xde, 0xab,
- 0xd2, 0x3f, 0xfd, 0x1b, 0x4e, 0x08, 0x42, 0x54,
- 0xe1, 0x72, 0x15, 0x62, 0xf2, 0x7e, 0x79, 0x67,
- 0x2f, 0x05, 0xe3, 0xa7, 0xab, 0xef, 0x84, 0xe9,
- 0xf3, 0xc3, 0xb4, 0x51, 0xd3, 0xff, 0xc9, 0xcf,
- 0x5d, 0x40, 0x7e, 0x81, 0xcf, 0xae, 0x3a, 0x17,
- 0xaa, 0x34, 0x36, 0x69, 0xe4, 0x5a, 0x27, 0x9c,
- 0xed, 0xf4, 0xe9, 0xfb, 0x48, 0xb7, 0x6e, 0xa1,
- 0xd0, 0xe3, 0xcb, 0xd0, 0xe4, 0xeb, 0xae, 0x5e,
- 0xce, 0x9b, 0xec, 0xbd, 0x1b, 0x76, 0xcb, 0xd2,
- 0x36, 0xbd, 0x30, 0x89, 0x23, 0xf8, 0x7a, 0x1f,
- 0x2e, 0x21, 0xe2, 0x30, 0xec, 0x95, 0x27, 0x7d,
- 0x85, 0x85, 0xf7, 0x09, 0x25, 0xa1, 0x86, 0x24,
- 0x6a, 0x8c, 0x0a, 0xb2, 0xc0, 0x3d, 0x17, 0xa5,
- 0x34, 0x94, 0x7d, 0xa9, 0xd7, 0x9b, 0x9f, 0xd7,
- 0xe1, 0xf3, 0xce, 0x11, 0xb7, 0x84, 0x53, 0xff,
- 0xac, 0xaf, 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x14,
- 0x54, 0xfe, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0xe8,
- 0x9f, 0xfa, 0xde, 0xeb, 0x60, 0xb7, 0xfb, 0x1a,
- 0x24, 0xb9, 0xfd, 0x6c, 0x16, 0xff, 0x63, 0x45,
- 0xe5, 0x08, 0xde, 0x3b, 0xbc, 0x4e, 0xe3, 0xbc,
- 0x3b, 0x65, 0x25, 0x8e, 0xd4, 0x77, 0x58, 0x62,
- 0xf6, 0xb7, 0x8e, 0xa4, 0x75, 0x7a, 0x52, 0xb8,
- 0xed, 0x72, 0x64, 0xff, 0xeb, 0x2b, 0xdd, 0x6c,
- 0x16, 0xff, 0x63, 0x44, 0xb3, 0x3c, 0xdf, 0xec,
- 0x68, 0x8c, 0xe7, 0xed, 0xa2, 0x9e, 0xc0, 0x9d,
- 0x37, 0x5c, 0x74, 0x94, 0x74, 0xfb, 0x63, 0x5f,
- 0xb0, 0x9e, 0x9a, 0x8b, 0x79, 0x8b, 0x4f, 0xde,
- 0xed, 0x8f, 0x89, 0xd3, 0xa8, 0x8f, 0x9d, 0x02,
- 0x98, 0x82, 0x9f, 0xba, 0x99, 0xa2, 0xa9, 0xff,
- 0xb5, 0xb1, 0xf0, 0x72, 0x7d, 0xc8, 0xa3, 0xa7,
- 0xdd, 0x47, 0x53, 0xce, 0x8d, 0x9f, 0x62, 0xe4,
- 0x69, 0xff, 0xb1, 0x5a, 0xd8, 0x68, 0x95, 0xfb,
- 0xd9, 0xd3, 0xfe, 0xaa, 0x6e, 0xbb, 0x4e, 0xad,
- 0x71, 0xd2, 0xb6, 0x26, 0xa8, 0xb4, 0x2a, 0x7a,
- 0x49, 0x44, 0x79, 0xff, 0xd6, 0x57, 0xba, 0xd8,
- 0x2d, 0xfe, 0xc6, 0x89, 0xa6, 0x7f, 0xf5, 0x95,
- 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x71, 0x9f,
- 0xfd, 0x65, 0x7b, 0xad, 0x82, 0xdf, 0xec, 0x68,
- 0xa0, 0x67, 0xc2, 0xdf, 0xec, 0x68, 0xb8, 0x26,
- 0x4d, 0x9d, 0x3f, 0xba, 0xe4, 0xdf, 0x18, 0xa3,
- 0xa5, 0x6c, 0x3f, 0x8a, 0x98, 0x5c, 0x2b, 0x3f,
- 0xb7, 0x6e, 0x68, 0x0c, 0x09, 0xd3, 0xfc, 0xeb,
- 0x60, 0xb7, 0xfb, 0x1a, 0x24, 0x99, 0x5a, 0xa7,
- 0xeb, 0xe6, 0x90, 0xf2, 0xe9, 0xf3, 0xa5, 0x5b,
- 0x32, 0x4a, 0xca, 0x40, 0x52, 0xa4, 0x32, 0xb5,
- 0x0a, 0xa9, 0xff, 0x5f, 0xfb, 0x60, 0xb7, 0xfb,
- 0x1a, 0x2d, 0x49, 0xff, 0x7b, 0xad, 0x82, 0xdf,
- 0xec, 0x68, 0x95, 0x60, 0xe9, 0x5a, 0xfa, 0x26,
- 0x14, 0x91, 0x78, 0x8d, 0x3f, 0xad, 0x82, 0xdf,
- 0xec, 0x68, 0x8a, 0x67, 0xf5, 0xb0, 0x5b, 0xfd,
- 0x8d, 0x11, 0xa4, 0xfe, 0xb6, 0x0b, 0x7f, 0xb1,
- 0xa2, 0x9f, 0x9f, 0xfd, 0x65, 0x7b, 0xad, 0x82,
- 0xdf, 0xec, 0x68, 0x9a, 0xa7, 0xf5, 0xb0, 0x5b,
- 0xfd, 0x8d, 0x15, 0xdc, 0xf3, 0x7f, 0xb1, 0xa2,
- 0xbe, 0x9c, 0x10, 0x84, 0xa9, 0x74, 0xab, 0x17,
- 0x90, 0x27, 0xcc, 0xa4, 0x79, 0xce, 0x47, 0xce,
- 0x9f, 0xf6, 0x54, 0x3f, 0xaa, 0x26, 0x3c, 0x74,
- 0xff, 0xbf, 0x63, 0x8f, 0x6d, 0xd9, 0xc1, 0xd2,
- 0xb6, 0x22, 0xe1, 0x62, 0x1e, 0x8e, 0x50, 0xf6,
- 0x7f, 0xf5, 0x95, 0xee, 0xb6, 0x0b, 0x7f, 0xb1,
- 0xa2, 0x7b, 0x9f, 0xd6, 0xc1, 0x6f, 0xf6, 0x34,
- 0x5c, 0x33, 0xff, 0x5b, 0xdd, 0x6c, 0x16, 0xff,
- 0x63, 0x44, 0x9f, 0x08, 0xae, 0xcd, 0xe3, 0xb7,
- 0x1d, 0xdf, 0x3b, 0x63, 0xb5, 0x94, 0x86, 0x35,
- 0x9a, 0xa1, 0xd1, 0x49, 0x71, 0xdc, 0xfe, 0xb6,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x2a, 0x9f, 0xd6, 0xc1,
- 0x6f, 0xf6, 0x34, 0x53, 0x33, 0xff, 0xac, 0xaf,
- 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x13, 0x3c, 0xff,
- 0xeb, 0x2b, 0xdd, 0x6c, 0x16, 0xff, 0x63, 0x45,
- 0x1b, 0x0f, 0x26, 0x35, 0xc1, 0xdd, 0xf3, 0xbd,
- 0x29, 0x4f, 0xfd, 0x6f, 0x75, 0xb0, 0x5b, 0xfd,
- 0x8d, 0x11, 0xd4, 0xfd, 0xbc, 0xef, 0x18, 0xf1,
- 0xd3, 0xe1, 0x6f, 0xf6, 0x34, 0x53, 0x53, 0xf6,
- 0xd1, 0x4f, 0x60, 0x4e, 0x9f, 0xfe, 0xcd, 0x57,
- 0x1c, 0x3f, 0xdd, 0x57, 0xdc, 0x74, 0xc8, 0x03,
- 0xa7, 0xfa, 0x9e, 0xfa, 0x36, 0xda, 0xc2, 0x88,
- 0xfe, 0x96, 0xf3, 0x4d, 0x95, 0xb8, 0x4d, 0x2f,
- 0x0b, 0xb5, 0x0b, 0xf9, 0xf0, 0xb7, 0xfb, 0x1a,
- 0x2a, 0xa9, 0xff, 0x7b, 0xad, 0x82, 0xdf, 0xec,
- 0x68, 0x9b, 0x65, 0x6c, 0x3f, 0x65, 0x18, 0x4f,
- 0xeb, 0x60, 0xb7, 0xfb, 0x1a, 0x2b, 0xf9, 0xfd,
- 0x6c, 0x16, 0xff, 0x63, 0x45, 0x8d, 0x3e, 0x16,
- 0xff, 0x63, 0x45, 0xab, 0x3f, 0xef, 0x75, 0xb0,
- 0x5b, 0xfd, 0x8d, 0x14, 0x14, 0xad, 0x87, 0xec,
- 0xa3, 0x09, 0xfd, 0x6c, 0x16, 0xff, 0x63, 0x45,
- 0xc5, 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0xba,
- 0x67, 0xff, 0xdd, 0xfb, 0x69, 0xd8, 0x23, 0xee,
- 0x7b, 0x02, 0x74, 0xfd, 0x7a, 0xf7, 0x2b, 0xfa,
- 0x3a, 0x79, 0xbf, 0xd8, 0xd1, 0x26, 0x4f, 0xf0,
- 0xe3, 0xfa, 0xd7, 0xba, 0x87, 0x40, 0x9f, 0x1a,
- 0x8a, 0xe7, 0xee, 0x01, 0x7a, 0xd0, 0x0b, 0xe7,
- 0x4f, 0xb3, 0x5b, 0x57, 0x9d, 0x3f, 0xfe, 0xf6,
- 0x14, 0xaf, 0x73, 0x59, 0x60, 0x84, 0x25, 0x43,
- 0x8f, 0xe3, 0x44, 0xd3, 0xff, 0xae, 0xef, 0xe9,
- 0x06, 0x95, 0x4e, 0xe8, 0xe9, 0xc1, 0x08, 0x4a,
- 0x9f, 0x87, 0xde, 0x56, 0xe8, 0x55, 0x8b, 0xc9,
- 0xf6, 0x28, 0x72, 0xf6, 0x74, 0xff, 0x94, 0x8d,
- 0x5e, 0xdd, 0xa4, 0xa1, 0xd3, 0xfd, 0x9e, 0x0e,
- 0x59, 0xc7, 0xb8, 0xe9, 0xff, 0xde, 0xf5, 0x76,
- 0x9d, 0xc5, 0xb6, 0x3b, 0x3a, 0x31, 0x18, 0x3a,
- 0x3e, 0x09, 0xcc, 0xfd, 0x7b, 0xee, 0x57, 0xf4,
- 0x74, 0xf6, 0x9e, 0xce, 0x0e, 0x9f, 0xed, 0xdf,
- 0xe6, 0x20, 0x56, 0xe8, 0x74, 0x2c, 0x7c, 0x0b,
- 0xe4, 0x73, 0x82, 0x10, 0x9d, 0x3f, 0xfe, 0xc5,
- 0x6b, 0xa8, 0x0c, 0xe2, 0x98, 0xa4, 0x62, 0xac,
- 0x5e, 0x46, 0x26, 0x69, 0xb8, 0x48, 0x55, 0x0a,
- 0x7f, 0x08, 0xf8, 0xf5, 0x1c, 0x74, 0xce, 0xb2,
- 0xf1, 0x73, 0x63, 0x21, 0x29, 0x7c, 0x85, 0xf8,
- 0x57, 0xac, 0x45, 0xec, 0xbd, 0x3c, 0xa4, 0x3a,
- 0xb5, 0x1b, 0x1f, 0x33, 0x59, 0xf6, 0x28, 0x72,
- 0xf6, 0x74, 0xff, 0xd9, 0x5e, 0xa3, 0xdc, 0xeb,
- 0x5f, 0xbd, 0x9d, 0x3f, 0x7b, 0x58, 0x21, 0x09,
- 0xd2, 0xb3, 0x2f, 0x40, 0xfc, 0xe9, 0x5f, 0x61,
- 0x6f, 0x42, 0x95, 0xc9, 0x50, 0xe6, 0x56, 0xd7,
- 0x11, 0xcb, 0xbf, 0x0b, 0x21, 0x27, 0x51, 0xd8,
- 0x21, 0x63, 0x42, 0x7d, 0x1d, 0xdd, 0x3d, 0x79,
- 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0x8d, 0x67,
- 0xc2, 0xdf, 0xec, 0x68, 0xa9, 0x66, 0xf6, 0x34,
- 0x43, 0x52, 0xb6, 0x1e, 0x8f, 0x98, 0x4f, 0xfd,
- 0x6f, 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x11, 0xf4,
- 0xfe, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0xc7, 0x9f,
- 0xaf, 0x5e, 0xe5, 0x7f, 0x47, 0x4f, 0xf7, 0x7c,
- 0x14, 0xfd, 0x6b, 0xce, 0x9e, 0x02, 0xb6, 0x27,
- 0x4f, 0xff, 0xf2, 0x0f, 0x73, 0x8c, 0xad, 0x76,
- 0xd5, 0xde, 0xa9, 0xef, 0x9d, 0x1b, 0x44, 0x3d,
- 0x48, 0x67, 0xc2, 0xdf, 0xec, 0x68, 0xb4, 0x27,
- 0xe5, 0xdc, 0xf5, 0xd4, 0x01, 0xd3, 0xe4, 0xd6,
- 0x55, 0x0e, 0x9f, 0xfe, 0xcd, 0x53, 0x16, 0xaa,
- 0x2e, 0xca, 0xd5, 0x0e, 0x87, 0x8f, 0xd7, 0xa4,
- 0xb0, 0x88, 0xc9, 0xc8, 0x53, 0x4f, 0xf7, 0x73,
- 0x35, 0x5f, 0xed, 0xf3, 0xa7, 0xf6, 0x55, 0x6d,
- 0xd7, 0x6a, 0x3a, 0x7f, 0x3b, 0x06, 0x9d, 0x47,
- 0x8e, 0x9f, 0xec, 0xc0, 0xe3, 0x36, 0x04, 0xe8,
- 0xc4, 0x4d, 0x3e, 0x69, 0x43, 0x29, 0xec, 0xaf,
- 0xe8, 0xe9, 0xfd, 0x7f, 0x7d, 0xb9, 0xd9, 0x43,
- 0xa5, 0x65, 0xe2, 0xb8, 0xa4, 0x31, 0xe2, 0x17,
- 0xd8, 0x47, 0x58, 0x7c, 0xd0, 0x9b, 0x50, 0xd3,
- 0x5f, 0x30, 0xe6, 0x41, 0x3f, 0x5e, 0x6f, 0x8e,
- 0xa2, 0xc7, 0x4f, 0x65, 0x7f, 0x47, 0x4a, 0xf5,
- 0xc3, 0xd2, 0xe9, 0x94, 0xf8, 0x5b, 0xfd, 0x8d,
- 0x16, 0xb4, 0xff, 0xbd, 0xd6, 0xc1, 0x6f, 0xf6,
- 0x34, 0x50, 0x72, 0xb2, 0xf1, 0x14, 0x58, 0x58,
- 0xa3, 0x09, 0xff, 0xd6, 0x57, 0xba, 0xd8, 0x2d,
- 0xfe, 0xc6, 0x8a, 0x2e, 0x7f, 0x5b, 0x05, 0xbf,
- 0xd8, 0xd1, 0x75, 0x43, 0x97, 0xc6, 0x9a, 0x11,
- 0x9b, 0x26, 0x52, 0x65, 0x65, 0xe2, 0x82, 0x39,
- 0x1a, 0x1c, 0xe9, 0x4a, 0x7c, 0x2d, 0xfe, 0xc6,
- 0x88, 0x86, 0x75, 0x73, 0x83, 0xa5, 0x6c, 0x3c,
- 0xc7, 0xcc, 0x27, 0xf5, 0xb0, 0x5b, 0xfd, 0x8d,
- 0x11, 0xb4, 0xfe, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2,
- 0x9b, 0x9f, 0xd6, 0xc1, 0x6f, 0xf6, 0x34, 0x54,
- 0x13, 0xfa, 0xd8, 0x2d, 0xfe, 0xc6, 0x8a, 0x9a,
- 0x7c, 0x2d, 0xfe, 0xc6, 0x8a, 0xc2, 0x7d, 0xb0,
- 0xf1, 0x70, 0x9d, 0x3f, 0xce, 0xb6, 0x0b, 0x7f,
- 0xb1, 0xa2, 0x3f, 0x9d, 0x88, 0xf1, 0xd2, 0xb6,
- 0x22, 0xd5, 0x8c, 0x3c, 0xa7, 0xa8, 0x33, 0xff,
- 0xac, 0xaf, 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x13,
- 0x7c, 0xff, 0xca, 0xf7, 0x5b, 0x05, 0xbf, 0xd8,
- 0xd1, 0x3f, 0x4f, 0xd7, 0xa1, 0x7a, 0xde, 0xab,
- 0xf8, 0xf9, 0xd3, 0xff, 0xc8, 0x88, 0x88, 0x88,
- 0x88, 0x8f, 0xd0, 0xe9, 0xf0, 0xed, 0xef, 0x51,
- 0x53, 0x04, 0x25, 0x46, 0x1b, 0xd0, 0x93, 0xca,
- 0xe2, 0xac, 0x68, 0x21, 0x11, 0x8f, 0x48, 0x53,
- 0x4f, 0xc3, 0xed, 0x5d, 0x89, 0xd3, 0xcf, 0x2b,
- 0x6e, 0x3a, 0x7f, 0x55, 0x15, 0x60, 0x01, 0x0e,
- 0x90, 0xa1, 0xea, 0xec, 0x8e, 0x70, 0x29, 0x87,
- 0x4f, 0x53, 0x5b, 0x58, 0xe8, 0x44, 0xc2, 0xb6,
- 0x4e, 0x2f, 0xfd, 0x26, 0xd0, 0xdc, 0xf7, 0xad,
- 0xcd, 0x47, 0x4d, 0xfd, 0x3a, 0x04, 0xdc, 0xa8,
- 0x92, 0x70, 0x42, 0x13, 0xa7, 0x9e, 0xee, 0xd0,
- 0xab, 0x17, 0x93, 0xcf, 0xeb, 0x6c, 0x74, 0x22,
- 0x23, 0xea, 0x79, 0x71, 0x8c, 0xff, 0xcf, 0x5c,
- 0x0c, 0xed, 0xcb, 0x26, 0xbc, 0xe9, 0xe4, 0xd5,
- 0x18, 0xd1, 0x07, 0x40, 0x9f, 0xa6, 0x91, 0xe6,
- 0x1e, 0x0e, 0x98, 0x21, 0x3a, 0x1c, 0x6b, 0x02,
- 0x2d, 0x3d, 0x44, 0xda, 0xe2, 0xac, 0x68, 0x67,
- 0xd4, 0xe7, 0xc0, 0x28, 0x74, 0x6c, 0xf7, 0xb9,
- 0x99, 0xce, 0x08, 0x42, 0x54, 0x15, 0x62, 0xf2,
- 0x7b, 0x61, 0xda, 0xc5, 0x43, 0x1b, 0xcd, 0x8c,
- 0xc6, 0xd3, 0x68, 0xac, 0x33, 0x3a, 0xf9, 0x3d,
- 0xc7, 0xf4, 0x07, 0x4f, 0xfc, 0x9d, 0x07, 0x51,
- 0xf5, 0x93, 0xa0, 0x3a, 0x00, 0x7c, 0xf4, 0x22,
- 0x9f, 0x96, 0x4c, 0x1a, 0xec, 0xe9, 0xfb, 0x58,
- 0xb7, 0x51, 0x47, 0x88, 0x0a, 0x7d, 0xfd, 0xe2,
- 0xa8, 0x68, 0x80, 0xac, 0x6e, 0xa7, 0xc8, 0x0d,
- 0xbf, 0x43, 0xa7, 0xf0, 0xad, 0x4d, 0xf7, 0x5b,
- 0x3a, 0x79, 0xf0, 0x0a, 0x15, 0x30, 0x42, 0x54,
- 0x21, 0xb7, 0x09, 0x0c, 0xfd, 0xe2, 0xe7, 0x77,
- 0x65, 0x58, 0xd0, 0x42, 0x27, 0x77, 0x84, 0x5b,
- 0x66, 0xea, 0x26, 0x8a, 0x2e, 0x84, 0x5c, 0xfa,
- 0xed, 0x5d, 0xfc, 0xcd, 0x10, 0x3c, 0xff, 0xab,
- 0x73, 0xc9, 0xc9, 0x34, 0x9c, 0x1d, 0x3b, 0xc5,
- 0xe3, 0xa6, 0x08, 0x4e, 0x9f, 0xc3, 0xbc, 0x5d,
- 0xcd, 0xd6, 0x63, 0x62, 0x11, 0xb9, 0x27, 0x08,
- 0xbf, 0x17, 0x39, 0xff, 0xd8, 0xa5, 0x7b, 0xb0,
- 0x5b, 0xfd, 0x8d, 0x10, 0xc4, 0x54, 0xfe, 0x7a,
- 0x51, 0x3f, 0x60, 0xb7, 0xfb, 0x1a, 0x20, 0xa9,
- 0xed, 0x51, 0x00, 0x54, 0xef, 0x17, 0x8a, 0x9e,
- 0xbb, 0xbf, 0x7c, 0xa9, 0xfd, 0xb7, 0xb3, 0x54,
- 0x40, 0x15, 0x05, 0x4f, 0xd8, 0xc9, 0x54, 0x51,
- 0x53, 0x04, 0x25, 0x4f, 0xdd, 0x4e, 0xbd, 0xb1,
- 0x2a, 0x31, 0x30, 0xa6, 0x21, 0x50, 0xdd, 0x49,
- 0x00, 0x67, 0xd0, 0xa0, 0x95, 0x73, 0x16, 0x9b,
- 0x62, 0x55, 0x8f, 0xca, 0x5e, 0xe4, 0xf5, 0xeb,
- 0x1d, 0x8c, 0xff, 0x91, 0xdf, 0xdc, 0xa0, 0xa5,
- 0x0e, 0x9f, 0xf2, 0x6a, 0xa8, 0xbb, 0x84, 0x02,
- 0x1d, 0x3f, 0xff, 0x2d, 0xfe, 0xef, 0xaf, 0x2c,
- 0x7a, 0xed, 0x5d, 0xfc, 0xcd, 0x17, 0xdc, 0xfb,
- 0x7a, 0xee, 0x38, 0xe9, 0xff, 0x77, 0x6e, 0xd5,
- 0x70, 0x77, 0x43, 0xa7, 0xf6, 0x81, 0xcf, 0xae,
- 0xae, 0x1e, 0x20, 0x19, 0xde, 0x2e, 0x3c, 0x40,
- 0x31, 0x87, 0xd3, 0x72, 0x14, 0xde, 0xe3, 0xc4,
- 0x03, 0x3d, 0xfd, 0x7d, 0xc7, 0x88, 0x06, 0x7f,
- 0x6d, 0xab, 0x80, 0x02, 0x1e, 0x20, 0x19, 0xdb,
- 0xef, 0x07, 0x88, 0x06, 0x38, 0x45, 0xca, 0x88,
- 0xaa, 0x5e, 0xb8, 0xfa, 0x70, 0xa6, 0x8f, 0x10,
- 0x0c, 0x1e, 0x20, 0x19, 0x91, 0x47, 0x88, 0x06,
- 0x38, 0x37, 0x3b, 0x17, 0x9e, 0xda, 0xb8, 0x43,
- 0xc4, 0x03, 0x3b, 0x5e, 0xc7, 0x88, 0x06, 0x7f,
- 0xdd, 0xf7, 0x5a, 0xbb, 0x6f, 0x13, 0xc4, 0x03,
- 0x37, 0xf0, 0x78, 0x80, 0x67, 0xf7, 0x7c, 0x34,
- 0xa2, 0x00, 0xf1, 0x00, 0xcf, 0xb7, 0x7f, 0xfa,
- 0x03, 0xc4, 0x03, 0x36, 0xe8, 0x78, 0x80, 0x60,
- 0x4f, 0x67, 0x46, 0xd3, 0xed, 0x75, 0x1f, 0x71,
- 0xa2, 0x01, 0x98, 0x08, 0x78, 0x80, 0x6c, 0x6d,
- 0x67, 0xdb, 0x45, 0x7f, 0x07, 0x88, 0x06, 0x7a,
- 0xef, 0xeb, 0x1e, 0x20, 0x19, 0xc8, 0x2c, 0x78,
- 0x80, 0x67, 0xfd, 0x8f, 0xd3, 0x84, 0xce, 0x82,
- 0x87, 0x88, 0x06, 0x7d, 0x77, 0xb9, 0xc8, 0x78,
- 0x80, 0x63, 0x11, 0x01, 0x54, 0xc9, 0x84, 0x07,
- 0x88, 0x06, 0x1c, 0xaa, 0x3f, 0x82, 0x3c, 0x84,
- 0xc6, 0xd5, 0xaa, 0x64, 0x03, 0x4a, 0x17, 0x6a,
- 0x14, 0xd7, 0x11, 0x4f, 0xb3, 0x54, 0xf7, 0xcf,
- 0x10, 0x0c, 0xfe, 0xe1, 0x19, 0x61, 0x4d, 0x1e,
- 0x20, 0x1e, 0x0d, 0xa4, 0xe1, 0x40, 0x9e, 0x20,
- 0x18, 0x63, 0xf7, 0x15, 0x09, 0xed, 0xf5, 0xd4,
- 0x3c, 0x40, 0x33, 0xf7, 0xac, 0xec, 0x7d, 0xc7,
- 0x88, 0x06, 0x31, 0x11, 0x40, 0x20, 0xb8, 0xbe,
- 0x7f, 0xf7, 0xbd, 0xc5, 0x52, 0x96, 0xa5, 0xc2,
- 0x03, 0xc4, 0x03, 0x30, 0x80, 0xf1, 0x00, 0xcf,
- 0xbf, 0x54, 0xdb, 0xe7, 0x88, 0x06, 0x7e, 0xdf,
- 0x6e, 0x76, 0x50, 0xf1, 0x00, 0xc2, 0x22, 0x4b,
- 0xa4, 0x5a, 0x35, 0x8e, 0x17, 0xf5, 0x72, 0x1b,
- 0x6b, 0x20, 0x0b, 0x05, 0x48, 0xbc, 0xbc, 0x04,
- 0xf4, 0x95, 0xb1, 0xa8, 0xf0, 0x17, 0xcc, 0x39,
- 0xc3, 0xae, 0x77, 0xfb, 0x1a, 0x20, 0x1b, 0x22,
- 0xda, 0x7a, 0xfd, 0xe9, 0x70, 0xa3, 0xa6, 0x02,
- 0x15, 0x2b, 0xe5, 0x4e, 0xaa, 0x3c, 0x74, 0xc1,
- 0x09, 0x51, 0xb3, 0xd9, 0xbd, 0x8a, 0xac, 0x24,
- 0x11, 0xc9, 0xca, 0xdd, 0x0a, 0xb1, 0xe0, 0xcf,
- 0x6a, 0x97, 0x97, 0x1d, 0x0f, 0x32, 0xaa, 0x9c,
- 0x4e, 0xd4, 0x93, 0x2d, 0x9c, 0x02, 0x18, 0xdc,
- 0xcb, 0x67, 0xe1, 0x59, 0xc8, 0x2f, 0x1d, 0x3f,
- 0xe7, 0x53, 0x97, 0x71, 0x48, 0x37, 0xce, 0x9f,
- 0xb9, 0x84, 0x77, 0x95, 0x2a, 0x79, 0x6a, 0xfa,
- 0xc7, 0x4f, 0xb1, 0x67, 0x23, 0xe7, 0x4f, 0x67,
- 0x51, 0xc5, 0x40, 0x9f, 0x5f, 0x48, 0xef, 0x0a,
- 0x21, 0x13, 0x38, 0xc2, 0xda, 0xa0, 0xfc, 0x26,
- 0x67, 0xb7, 0xdd, 0x50, 0xe9, 0xd7, 0x2f, 0x74,
- 0x3a, 0x7f, 0xed, 0x53, 0x38, 0x47, 0xe9, 0x8f,
- 0xe8, 0xe8, 0x43, 0xe8, 0xf2, 0x29, 0xf7, 0xae,
- 0xe3, 0x84, 0x3a, 0x6a, 0x50, 0xe9, 0xc1, 0x08,
- 0x4e, 0x98, 0x1e, 0x55, 0x8b, 0xc8, 0x13, 0xd6,
- 0xa1, 0x94, 0xef, 0x06, 0x15, 0x0e, 0x45, 0xda,
- 0xa1, 0x00, 0xbe, 0x43, 0x3f, 0xb5, 0xdc, 0x7c,
- 0x1c, 0xdc, 0x74, 0xff, 0x77, 0x17, 0x65, 0x82,
- 0x10, 0x95, 0x39, 0x5f, 0xa3, 0xa2, 0xa7, 0xaa,
- 0xb8, 0xea, 0x11, 0x1c, 0xfb, 0x38, 0xf8, 0x45,
- 0xcd, 0x5f, 0x3a, 0x65, 0xa8, 0x74, 0xfd, 0x6c,
- 0x5d, 0xbe, 0xf1, 0x86, 0xb3, 0x98, 0xac, 0xf7,
- 0x19, 0x5f, 0x3a, 0x7f, 0xe4, 0xce, 0xba, 0xb9,
- 0xde, 0xa0, 0x4e, 0x96, 0xc5, 0x15, 0x7d, 0x48,
- 0xd1, 0x0c, 0x3c, 0xda, 0x4c, 0x3a, 0x37, 0x0e,
- 0x23, 0xf9, 0xbe, 0x5e, 0xc7, 0x7b, 0x3f, 0x1a,
- 0x58, 0xc5, 0x63, 0xa3, 0x02, 0x07, 0x61, 0x15,
- 0xa8, 0xf0, 0x97, 0x46, 0x15, 0x3f, 0x74, 0x19,
- 0xc7, 0xb8, 0xe9, 0xf7, 0x35, 0x9c, 0x97, 0xb2,
- 0xa3, 0x0f, 0x6f, 0x99, 0x6c, 0xff, 0xe1, 0xbf,
- 0xdb, 0xbf, 0x9e, 0x53, 0x69, 0xd3, 0xa5, 0xcc,
- 0xd1, 0x02, 0xcb, 0x46, 0xa0, 0x52, 0x5b, 0xd1,
- 0xbc, 0x08, 0xfc, 0xff, 0xb6, 0xbf, 0x5d, 0xf3,
- 0xb0, 0x00, 0x85, 0x4f, 0xfe, 0xd5, 0x3d, 0xfe,
- 0x4a, 0x4c, 0xee, 0x97, 0xce, 0x84, 0x44, 0x9e,
- 0xd1, 0x27, 0x3d, 0xd7, 0x1d, 0x08, 0x9c, 0x12,
- 0xa1, 0x13, 0x58, 0x5d, 0x5c, 0x45, 0x3f, 0x9c,
- 0xb6, 0x77, 0xeb, 0x87, 0x4f, 0xfe, 0x16, 0xee,
- 0x2e, 0xee, 0x20, 0xa5, 0x0e, 0x9f, 0xde, 0xb5,
- 0x71, 0x59, 0x43, 0xa3, 0x0f, 0xe5, 0x72, 0x3c,
- 0xff, 0xfc, 0x81, 0xa6, 0x9f, 0x6d, 0xd7, 0x95,
- 0xe6, 0x57, 0x6a, 0x3a, 0x36, 0x88, 0x4d, 0x11,
- 0xce, 0xe3, 0xc4, 0xe9, 0xf0, 0x3f, 0xb9, 0x78,
- 0x74, 0x21, 0xe2, 0x5c, 0x37, 0x3c, 0x8a, 0x7d,
- 0x63, 0xa1, 0x13, 0xdb, 0x74, 0x65, 0xf4, 0x67,
- 0xd1, 0x14, 0xf0, 0x3d, 0xfa, 0x1d, 0x30, 0x42,
- 0x74, 0x50, 0xdc, 0x04, 0x8a, 0x7e, 0xa6, 0xeb,
- 0xf9, 0x52, 0xac, 0x68, 0x67, 0x04, 0x21, 0x2a,
- 0x79, 0xda, 0xc6, 0x2a, 0xc5, 0xe4, 0xfb, 0x38,
- 0xd8, 0x28, 0x74, 0xbc, 0x4f, 0x5f, 0xa5, 0xf3,
- 0xf7, 0x5f, 0xa2, 0xd9, 0xa3, 0xa7, 0xcf, 0x5e,
- 0xf7, 0x8f, 0x9d, 0x3f, 0xec, 0x6e, 0x30, 0x43,
- 0xf5, 0x58, 0xe9, 0x9c, 0xf1, 0x50, 0xf9, 0xea,
- 0x74, 0xf6, 0x05, 0x14, 0x9f, 0x08, 0x18, 0x44,
- 0xc7, 0xf0, 0x9b, 0xe1, 0xa7, 0x3f, 0xeb, 0xe8,
- 0xff, 0x52, 0xb5, 0xb9, 0x8e, 0x9f, 0xbb, 0xf7,
- 0xeb, 0xee, 0x3a, 0x70, 0x42, 0x12, 0xa7, 0x73,
- 0x40, 0x15, 0x62, 0xf2, 0x7f, 0xbb, 0xe0, 0xe4,
- 0xe4, 0x03, 0xe7, 0x47, 0x08, 0xf2, 0x52, 0x08,
- 0x12, 0xb4, 0x59, 0x38, 0x21, 0x09, 0x62, 0x10,
- 0x9f, 0x0b, 0x7f, 0xb1, 0x62, 0x10, 0xb1, 0xa9,
- 0x9c, 0x10, 0x84, 0xb1, 0x07, 0xc1, 0x62, 0x0f,
- 0xb1, 0xa9, 0x99, 0x15, 0x88, 0x90, 0x66, 0x99,
- 0xf6, 0x93, 0x48, 0xa3, 0xa7, 0xbb, 0xb4, 0xbe,
- 0x74, 0xee, 0x68, 0x03, 0xa1, 0xe3, 0xc0, 0x51,
- 0x1c, 0xf9, 0x92, 0xa8, 0xa2, 0xa7, 0xdd, 0xfe,
- 0xf7, 0x0a, 0x9b, 0x18, 0xa9, 0x82, 0x12, 0xa3,
- 0x0f, 0xd6, 0x84, 0xba, 0x26, 0x08, 0xa4, 0xfe,
- 0xef, 0x34, 0x05, 0x72, 0xf0, 0xab, 0x1b, 0xb8,
- 0x44, 0xe0, 0x36, 0xcd, 0xf0, 0xd3, 0x9f, 0xfd,
- 0x54, 0x05, 0x33, 0x38, 0xfe, 0xfd, 0xf3, 0xa7,
- 0xf5, 0x39, 0xaa, 0x81, 0xf7, 0xce, 0x84, 0x56,
- 0xaf, 0xb8, 0x7b, 0x8c, 0x75, 0x9e, 0x69, 0x44,
- 0xa9, 0xc1, 0x08, 0x4a, 0x9f, 0x38, 0x1f, 0xde,
- 0x0a, 0xb1, 0x79, 0x3f, 0xfd, 0xd7, 0xf9, 0x3e,
- 0x04, 0xeb, 0x7b, 0xdd, 0xf3, 0xa7, 0xff, 0xce,
- 0xc4, 0xb7, 0x1d, 0x4b, 0x9b, 0x2f, 0xec, 0x4e,
- 0x9e, 0xdf, 0x18, 0xa3, 0xa1, 0x13, 0x02, 0x71,
- 0xbf, 0xa9, 0xdc, 0xad, 0x3f, 0xea, 0x51, 0x07,
- 0x49, 0x6e, 0x36, 0x74, 0xff, 0xbb, 0xeb, 0x57,
- 0xc4, 0x77, 0xc1, 0xd1, 0xb3, 0xfc, 0x51, 0xf4,
- 0xfd, 0xe3, 0xc6, 0x67, 0x4e, 0x9f, 0xfe, 0xcd,
- 0x53, 0x16, 0xaa, 0x2e, 0xca, 0xd5, 0x0e, 0x9f,
- 0xda, 0xbd, 0x0b, 0x75, 0x7a, 0x3d, 0x71, 0xd1,
- 0xc2, 0x2f, 0xba, 0x57, 0xa5, 0x09, 0xff, 0xfd,
- 0xdd, 0x65, 0x76, 0x9a, 0xd8, 0x11, 0xd6, 0x08,
- 0x42, 0x54, 0xf7, 0x19, 0x97, 0xca, 0x9c, 0xee,
- 0xdc, 0x68, 0x86, 0x67, 0x04, 0x21, 0x2a, 0x76,
- 0x75, 0x8a, 0xb1, 0x79, 0x3f, 0xec, 0x7b, 0x38,
- 0xf7, 0x75, 0x1e, 0x3a, 0x00, 0x7d, 0x1d, 0x29,
- 0x84, 0x4d, 0x51, 0xe6, 0x17, 0xc8, 0xc6, 0x15,
- 0xd3, 0xdb, 0xd6, 0xd0, 0xe9, 0xfd, 0x76, 0x08,
- 0x01, 0xbe, 0x9d, 0x3f, 0xfe, 0x47, 0x6f, 0x8a,
- 0xf3, 0xa6, 0x0b, 0x7f, 0xb1, 0xa2, 0x0c, 0x8a,
- 0xa2, 0x53, 0x46, 0x73, 0xf9, 0x7f, 0x28, 0xbf,
- 0x82, 0x87, 0x43, 0x93, 0x0e, 0xdc, 0x2d, 0x74,
- 0x47, 0x3f, 0xfc, 0x9d, 0x7b, 0x92, 0xdb, 0xee,
- 0x71, 0x9d, 0xbe, 0x74, 0xe4, 0x15, 0x8e, 0x84,
- 0x5c, 0x5d, 0xc8, 0x70, 0x6e, 0x38, 0x5f, 0x8d,
- 0x46, 0xe3, 0x65, 0xf5, 0x69, 0xfd, 0xad, 0xae,
- 0xde, 0x9c, 0x85, 0x49, 0x47, 0x4f, 0xea, 0x67,
- 0x6f, 0x8a, 0x5b, 0x67, 0x8b, 0xcc, 0xd6, 0x78,
- 0x6e, 0x7d, 0xc7, 0x4f, 0xee, 0xbb, 0xb8, 0xa4,
- 0x63, 0xa7, 0x2b, 0x8c, 0x3a, 0x10, 0xfc, 0x30,
- 0x8f, 0xcc, 0x67, 0xfd, 0x76, 0xa9, 0xcc, 0x40,
- 0xad, 0xd0, 0xe9, 0xff, 0x93, 0xbf, 0x54, 0x05,
- 0x86, 0x94, 0x2a, 0x38, 0x44, 0x22, 0x90, 0xa7,
- 0xd5, 0xde, 0xdf, 0xa1, 0xd0, 0x54, 0xfd, 0x4e,
- 0x68, 0x28, 0xa2, 0xa0, 0xa8, 0x2a, 0x0a, 0x82,
- 0xa1, 0xc7, 0xbf, 0xb0, 0xa0, 0x16, 0xdc, 0x14,
- 0xbe, 0x15, 0x78, 0x15, 0x35, 0x70, 0xa9, 0xfb,
- 0xff, 0x4b, 0x22, 0x8a, 0xe4, 0x5a, 0xc9, 0x7b,
- 0x2a, 0x0a, 0x82, 0xa1, 0xc5, 0xa6, 0xc2, 0xa0,
- 0xa8, 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x1e,
- 0x37, 0x9c, 0x05, 0x6c, 0x28, 0x01, 0x54, 0x0a,
- 0x5c, 0x15, 0x05, 0x41, 0x50, 0xe2, 0xd2, 0x81,
- 0x50, 0x54, 0x15, 0x05, 0x41, 0x50, 0xe3, 0x50,
- 0x00, 0xad, 0x05, 0x5e, 0x05, 0x41, 0x50, 0x54,
- 0x15, 0x05, 0x43, 0xc6, 0xa2, 0xf8, 0x50, 0x85,
- 0x54, 0x2a, 0x57, 0xca, 0x82, 0xa0, 0xa8, 0x2a,
- 0x0a, 0x8e, 0x0d, 0x43, 0xe1, 0x40, 0x0a, 0xb8,
- 0x2a, 0x0a, 0x82, 0xa0, 0xa9, 0xf5, 0x50, 0x14,
- 0xc2, 0xa0, 0xa8, 0x71, 0xe7, 0x30, 0x55, 0x42,
- 0xbc, 0x28, 0x04, 0xd2, 0x62, 0xa0, 0xa8, 0x2a,
- 0x0a, 0x82, 0xa1, 0xc6, 0xa1, 0xf0, 0xad, 0x85,
- 0x2e, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87,
- 0x1a, 0x8e, 0x02, 0xaa, 0x15, 0xd0, 0xa9, 0x54,
- 0xa8, 0x2a, 0x0a, 0x93, 0x8a, 0x82, 0x9f, 0x2c,
- 0x20, 0xa8, 0x2a, 0x0a, 0x82, 0xa1, 0xe3, 0xe6,
- 0x70, 0x55, 0xf1, 0xa6, 0x1a, 0x58, 0x28, 0x01,
- 0x5a, 0x0a, 0x96, 0x15, 0x05, 0x41, 0x52, 0x71,
- 0x50, 0x53, 0xe5, 0x84, 0x15, 0x05, 0x42, 0x1e,
- 0x93, 0x82, 0xb6, 0x34, 0x23, 0x4a, 0x0a, 0x82,
- 0xa0, 0xa8, 0x2a, 0x0a, 0x82, 0xa1, 0x0d, 0x93,
- 0xe1, 0x42, 0x14, 0xa0, 0xae, 0x85, 0x41, 0x50,
- 0x54, 0x15, 0x02, 0x5f, 0x50, 0x2b, 0x41, 0x50,
- 0x54, 0x15, 0x05, 0x42, 0x8b, 0xee, 0x85, 0x68,
- 0x2a, 0x4a, 0x2a, 0x0a, 0x82, 0xa0, 0x05, 0xa5,
- 0xc1, 0x50, 0x54, 0x15, 0x05, 0x41, 0x50, 0x86,
- 0xa1, 0x60, 0xaa, 0x85, 0x5c, 0x15, 0x08, 0xbf,
- 0x5a, 0xf3, 0x93, 0x8f, 0x78, 0x29, 0xc5, 0xc6,
- 0x6d, 0x7d, 0x23, 0x6c, 0xd7, 0xb3, 0xd5, 0x8e,
- 0x86, 0x11, 0x8a, 0x47, 0xa9, 0xbf, 0xb3, 0x00,
- 0xf3, 0xae, 0xd4, 0x66, 0xd3, 0x0d, 0xcf, 0x2b,
- 0x99, 0x42, 0x94, 0xbe, 0x5b, 0xcc, 0x92, 0xf1,
- 0x26, 0x7c, 0xee, 0xa6, 0x50, 0xab, 0x26, 0xaf,
- 0x3b, 0x68, 0xa2, 0xa7, 0xb6, 0xde, 0x27, 0x4e,
- 0xdf, 0x18, 0x74, 0xf3, 0xe9, 0xce, 0xcf, 0xa2,
- 0x3c, 0x4e, 0x6a, 0x37, 0xa1, 0xf9, 0x80, 0x87,
- 0x4f, 0xc3, 0xfd, 0xe6, 0x80, 0x3a, 0x6f, 0x13,
- 0xa5, 0xb3, 0x98, 0xb4, 0x93, 0x1d, 0x25, 0x1d,
- 0x3b, 0x17, 0xed, 0xb4, 0x49, 0x88, 0xad, 0x50,
- 0x7c, 0x7b, 0x98, 0x7c, 0xff, 0xfa, 0xe4, 0xe5,
- 0xe2, 0x3e, 0x04, 0xb0, 0x42, 0x13, 0xa1, 0xcc,
- 0xd4, 0x9e, 0x21, 0x7b, 0xb8, 0x58, 0x2c, 0x49,
- 0xf4, 0xa1, 0xbe, 0xc3, 0xab, 0x4b, 0xd3, 0xf9,
- 0x3b, 0xaf, 0xed, 0xd8, 0x74, 0xfe, 0x17, 0x77,
- 0x6e, 0xae, 0x1d, 0x3e, 0xc0, 0x66, 0x2c, 0x74,
- 0xfd, 0x4c, 0x5d, 0xd4, 0x7c, 0xe9, 0x26, 0x22,
- 0x1f, 0xa6, 0x5a, 0x26, 0x9e, 0xbb, 0xc5, 0xc7,
- 0x4f, 0x25, 0xcb, 0xdd, 0x0a, 0x9f, 0x3a, 0xc1,
- 0x08, 0x4e, 0x8e, 0x9e, 0x7d, 0xc4, 0xf1, 0xc2,
- 0x24, 0xf1, 0xc2, 0x14, 0x9d, 0x18, 0x21, 0x73,
- 0x74, 0x31, 0xe7, 0xe1, 0xb8, 0x19, 0xd6, 0x3a,
- 0x7b, 0x8e, 0x11, 0x71, 0xd3, 0xff, 0xe4, 0xaa,
- 0x29, 0x93, 0x58, 0x2d, 0xfe, 0xc6, 0x8b, 0xe2,
- 0x7f, 0x07, 0xf5, 0x44, 0xc7, 0x8e, 0x9f, 0xff,
- 0xb3, 0x5c, 0xdc, 0x8b, 0xb7, 0xd0, 0x0e, 0xd1,
- 0x58, 0x54, 0xda, 0xc3, 0xa7, 0xc3, 0xb7, 0xbd,
- 0x46, 0x98, 0x4e, 0x7b, 0x57, 0x27, 0x9a, 0x61,
- 0x39, 0x80, 0x86, 0xa0, 0x4e, 0x7f, 0x77, 0xef,
- 0xe9, 0x04, 0x06, 0xa0, 0x4e, 0x7f, 0x53, 0x2b,
- 0xba, 0x5c, 0xf1, 0xa6, 0x13, 0x9b, 0x38, 0x34,
- 0xc2, 0x73, 0x04, 0x27, 0x98, 0x4e, 0x31, 0x34,
- 0xc7, 0xcd, 0x36, 0x5c, 0xa2, 0x2a, 0x20, 0x2e,
- 0x42, 0x09, 0x1c, 0xb4, 0x59, 0x84, 0xec, 0x7c,
- 0xf2, 0xdb, 0xe9, 0xfb, 0x06, 0x3c, 0x88, 0xa2,
- 0xa8, 0x4d, 0x4a, 0x53, 0x8e, 0x15, 0xb1, 0x31,
- 0x2d, 0x56, 0xf5, 0x2a, 0xda, 0x7d, 0xc6, 0x0e,
- 0xef, 0x9d, 0x3e, 0xee, 0x73, 0xc5, 0x8e, 0x9f,
- 0xc0, 0xe7, 0xd7, 0x2f, 0xfb, 0xc7, 0x47, 0x4f,
- 0x8b, 0x45, 0x30, 0x8b, 0x90, 0x39, 0x2e, 0x3b,
- 0x68, 0xdf, 0x08, 0xb9, 0xff, 0xca, 0xd5, 0x37,
- 0xd7, 0xdd, 0xad, 0xd3, 0x67, 0x4f, 0xff, 0xee,
- 0xe3, 0xf9, 0x4f, 0xed, 0x76, 0x9a, 0xad, 0xde,
- 0xa3, 0xa7, 0x0d, 0x28, 0x78, 0x80, 0xe7, 0xff,
- 0xed, 0xeb, 0x98, 0xa5, 0x53, 0x96, 0x0b, 0x7f,
- 0xb1, 0xa2, 0x03, 0xb1, 0xa8, 0x9f, 0xff, 0xf7,
- 0x7d, 0xd9, 0xd5, 0x9d, 0x8f, 0xbb, 0x9a, 0x02,
- 0xc1, 0x08, 0x4a, 0x9f, 0xc9, 0x82, 0xdf, 0xec,
- 0x68, 0x82, 0x67, 0xf9, 0x35, 0x82, 0xdf, 0xec,
- 0x68, 0xbe, 0x67, 0xdb, 0x5d, 0xdc, 0xa7, 0x07,
- 0xf4, 0xc7, 0x53, 0xfe, 0x7b, 0xdf, 0x5f, 0xcd,
- 0x77, 0xd7, 0x1d, 0x38, 0x21, 0x09, 0x53, 0xf6,
- 0xab, 0x8d, 0xe2, 0x55, 0x8b, 0xc8, 0x79, 0x13,
- 0x3d, 0x60, 0x9f, 0xf9, 0xe5, 0x23, 0xf4, 0xee,
- 0x3d, 0xcd, 0xc7, 0x4f, 0xff, 0x73, 0x7f, 0xbc,
- 0x9a, 0xbb, 0x00, 0x10, 0x5c, 0x74, 0xe0, 0x84,
- 0x25, 0x4f, 0xee, 0x60, 0x4e, 0xe3, 0xfa, 0x2a,
- 0xc5, 0xe4, 0xff, 0xfc, 0xbd, 0xf2, 0x6a, 0xef,
- 0x8e, 0x30, 0x3c, 0xb5, 0x4c, 0x78, 0xe9, 0x7d,
- 0x51, 0x57, 0x72, 0x24, 0x39, 0x54, 0x5e, 0xe1,
- 0xb4, 0x24, 0x8a, 0x49, 0xd4, 0x63, 0x73, 0xfe,
- 0xcd, 0x20, 0xd2, 0xa9, 0xdd, 0x1e, 0x20, 0x89,
- 0xfc, 0x98, 0x2d, 0xfe, 0xc6, 0x88, 0x22, 0xc7,
- 0x93, 0x3f, 0xbb, 0xf5, 0x11, 0xd8, 0x4e, 0x80,
- 0x1f, 0xe7, 0x52, 0xe7, 0xf9, 0x3b, 0xae, 0x79,
- 0x5f, 0x7c, 0xe9, 0xff, 0xef, 0x0e, 0xb2, 0xa9,
- 0xbd, 0x77, 0x2b, 0xb3, 0xa1, 0xc8, 0x88, 0xe9,
- 0xd4, 0xfe, 0xd7, 0x35, 0x50, 0x3e, 0xf9, 0xd3,
- 0xdb, 0x5b, 0x61, 0x3a, 0x7f, 0xfd, 0x73, 0xdd,
- 0x4c, 0xad, 0x93, 0x59, 0x5b, 0x84, 0xe9, 0xf6,
- 0x6a, 0x9c, 0xe9, 0xc1, 0xfc, 0xf3, 0x23, 0x9f,
- 0x9a, 0xbb, 0x5f, 0xdd, 0xf3, 0xa7, 0xe5, 0x25,
- 0xee, 0xb8, 0xf1, 0xd1, 0xc1, 0xf1, 0xec, 0xca,
- 0x70, 0xf3, 0xa1, 0xd3, 0xfe, 0xfe, 0xb6, 0x0b,
- 0x7f, 0xb1, 0xa2, 0x11, 0x84, 0x3e, 0x2b, 0x87,
- 0x67, 0xff, 0x26, 0x3f, 0xcf, 0x5b, 0xed, 0xce,
- 0xca, 0x1d, 0x3f, 0xfd, 0xfe, 0xf7, 0x3c, 0xaf,
- 0xaa, 0xc1, 0x08, 0x4e, 0x96, 0x70, 0x89, 0xe5,
- 0x93, 0x67, 0x04, 0x21, 0x2a, 0x7f, 0xb0, 0x1e,
- 0x38, 0xbb, 0x38, 0x2a, 0xc5, 0xe4, 0xc1, 0x09,
- 0x53, 0x82, 0x10, 0x95, 0x3f, 0x7b, 0xdc, 0x55,
- 0x28, 0x55, 0x8b, 0xc8, 0xea, 0x2d, 0x82, 0x8e,
- 0xbe, 0x65, 0x3e, 0x6d, 0xf1, 0xcd, 0x45, 0x58,
- 0xd9, 0xce, 0x08, 0x42, 0x54, 0xea, 0x20, 0x95,
- 0x62, 0xf2, 0x40, 0xd9, 0xff, 0xe9, 0x5a, 0x7e,
- 0xe3, 0xa8, 0xef, 0x63, 0xa7, 0xf7, 0x31, 0xe3,
- 0x6b, 0x93, 0x83, 0xa7, 0xf6, 0xab, 0x8b, 0xb3,
- 0x54, 0x3a, 0x05, 0x13, 0x15, 0x2c, 0xe9, 0xc4,
- 0x22, 0x3b, 0xf2, 0x18, 0x13, 0x9f, 0xbd, 0x3d,
- 0xe8, 0x3a, 0x7f, 0xf6, 0x5e, 0xff, 0xa0, 0xc6,
- 0x4a, 0xa2, 0x8e, 0x9f, 0x9b, 0x74, 0xae, 0xd6,
- 0x2a, 0x7f, 0xb9, 0x77, 0x1f, 0x75, 0x37, 0x7c,
- 0xe9, 0xe4, 0xf5, 0x2e, 0x2a, 0x70, 0x42, 0x12,
- 0xa7, 0xff, 0xb9, 0xa0, 0x33, 0x3b, 0xaa, 0xed,
- 0x3a, 0xf1, 0x56, 0x2f, 0x25, 0x8c, 0x89, 0xe5,
- 0x1f, 0x42, 0x27, 0x4c, 0xe2, 0xb7, 0xd2, 0xb6,
- 0x5d, 0x58, 0x6e, 0x4f, 0xff, 0x95, 0x8c, 0x9d,
- 0xfd, 0x53, 0x8b, 0xbc, 0x5c, 0x74, 0xf9, 0x35,
- 0x45, 0xd8, 0x74, 0x21, 0xfe, 0x69, 0x52, 0x7f,
- 0xfb, 0x6b, 0xb3, 0xbc, 0x77, 0xc3, 0x9d, 0xfb,
- 0xe7, 0x4f, 0xff, 0xf7, 0x15, 0xd8, 0x72, 0xf3,
- 0x6a, 0xfd, 0x52, 0xe7, 0x63, 0xfa, 0x3a, 0x31,
- 0x18, 0x1e, 0xa7, 0x08, 0xcf, 0x7b, 0x79, 0x35,
- 0xd0, 0x89, 0xe1, 0xdb, 0x25, 0xba, 0xee, 0x31,
- 0xb5, 0xa1, 0x54, 0x24, 0x6a, 0x85, 0x7d, 0x61,
- 0x4e, 0x08, 0x42, 0xf6, 0x18, 0x14, 0x95, 0x3b,
- 0xa8, 0xf3, 0x2e, 0x86, 0x60, 0x61, 0xc3, 0x39,
- 0x72, 0x74, 0xe9, 0xff, 0xec, 0xed, 0xb5, 0x7f,
- 0x6f, 0xd2, 0xb8, 0x0f, 0x3a, 0x4f, 0xb8, 0xfb,
- 0xf8, 0x1d, 0x9f, 0xaa, 0xb6, 0xeb, 0xb5, 0x1d,
- 0x3f, 0xee, 0xa6, 0xab, 0xe0, 0xf7, 0xe8, 0x74,
- 0xff, 0xd4, 0xfd, 0x8e, 0x3f, 0x60, 0x84, 0x27,
- 0x4f, 0xff, 0x75, 0x1d, 0xcb, 0x9e, 0xb7, 0xdb,
- 0x9d, 0x94, 0x3a, 0x31, 0x30, 0x66, 0x2f, 0xa9,
- 0xf0, 0x11, 0x27, 0xf2, 0x75, 0xdd, 0xcc, 0x01,
- 0xd3, 0xf9, 0xd8, 0x34, 0xea, 0x3c, 0x74, 0xff,
- 0xf2, 0x2e, 0x41, 0xb7, 0x3d, 0x77, 0x1e, 0xd8,
- 0x9e, 0xef, 0x79, 0xff, 0xec, 0xd2, 0x75, 0xb3,
- 0x55, 0xd8, 0x81, 0x8e, 0x9f, 0x7d, 0x33, 0xba,
- 0x3a, 0x76, 0xbe, 0xf6, 0x74, 0xfe, 0xd5, 0x77,
- 0x60, 0x7e, 0xce, 0x87, 0x93, 0x23, 0xe1, 0x7f,
- 0xa9, 0x9a, 0x26, 0xb8, 0x7e, 0x7f, 0xfe, 0xee,
- 0x52, 0xee, 0x59, 0x5f, 0xee, 0x2c, 0xe4, 0x7c,
- 0xe9, 0xff, 0x65, 0x2e, 0xc1, 0x6f, 0xf6, 0x34,
- 0x40, 0xd3, 0xec, 0xd5, 0x7d, 0xdc, 0x91, 0x4b,
- 0xd5, 0xe9, 0xff, 0xff, 0xfb, 0x35, 0x5f, 0xed,
- 0xfe, 0x54, 0x1f, 0xfd, 0x2e, 0xce, 0x39, 0x62,
- 0xbf, 0xaf, 0xb8, 0xf1, 0x05, 0xcf, 0xfb, 0xfe,
- 0xfb, 0x7f, 0x1c, 0xaf, 0x84, 0xf1, 0x05, 0xcf,
- 0xfd, 0x5d, 0xd7, 0x69, 0xdd, 0x72, 0xbe, 0x13,
- 0xc4, 0x17, 0x3f, 0x93, 0x7d, 0xd7, 0x2b, 0xe1,
- 0x3c, 0x41, 0x73, 0xf2, 0xb3, 0x8e, 0x57, 0xc2,
- 0x78, 0x82, 0xe7, 0xff, 0xfb, 0xfb, 0xdd, 0xab,
- 0x95, 0x1a, 0xbb, 0x1d, 0xdf, 0x7b, 0x02, 0x78,
- 0x82, 0xe6, 0x7f, 0x97, 0x09, 0xd0, 0xb2, 0x80,
- 0xab, 0x7a, 0x27, 0x4f, 0xe2, 0xaa, 0xa5, 0xbb,
- 0x28, 0xfa, 0x7b, 0xc4, 0x1e, 0x74, 0xff, 0xd5,
- 0xdd, 0x76, 0x9d, 0xd7, 0x2b, 0xe1, 0x3c, 0x41,
- 0x73, 0xfc, 0xb5, 0x1b, 0x6f, 0x72, 0xbe, 0x13,
- 0xc4, 0x17, 0x3e, 0xd5, 0x11, 0x5c, 0x99, 0x14,
- 0x5c, 0xd5, 0xa7, 0xff, 0x72, 0x6a, 0xed, 0x93,
- 0x54, 0xe5, 0x7c, 0x27, 0x88, 0x2e, 0x7f, 0xff,
- 0xee, 0xf7, 0x6a, 0xe5, 0x76, 0x72, 0xa3, 0x57,
- 0x63, 0xbb, 0xef, 0x60, 0x4f, 0x10, 0x5c, 0x62,
- 0x64, 0xcf, 0xa1, 0xfa, 0xe4, 0xff, 0x57, 0x63,
- 0xbb, 0xef, 0x60, 0x4f, 0x10, 0x5c, 0xff, 0xf7,
- 0xfb, 0xee, 0xa5, 0x77, 0xc7, 0x08, 0x28, 0x54,
- 0xff, 0xb1, 0xce, 0xba, 0x83, 0xd7, 0x97, 0xcf,
- 0x10, 0x5c, 0x32, 0x3a, 0x05, 0x22, 0x8a, 0x13,
- 0xfe, 0x6d, 0x8e, 0xbc, 0x14, 0xe4, 0x13, 0xc4,
- 0x17, 0x3f, 0x57, 0x75, 0xae, 0xc0, 0x68, 0x02,
- 0xe7, 0xd8, 0x0e, 0x57, 0xc2, 0x78, 0x82, 0xe6,
- 0xcd, 0x31, 0xf9, 0xd4, 0xee, 0x1f, 0x47, 0x5d,
- 0x21, 0x7f, 0x3f, 0x2b, 0x38, 0xe5, 0x7c, 0x27,
- 0x88, 0x2e, 0x7f, 0xcd, 0x5d, 0x8e, 0xef, 0xbd,
- 0x81, 0x3c, 0x41, 0x73, 0x67, 0x2f, 0x44, 0x65,
- 0x0f, 0xe7, 0xf5, 0xdb, 0x57, 0xf5, 0xf7, 0x1e,
- 0x20, 0xb9, 0xff, 0x66, 0xd7, 0x67, 0x73, 0x8f,
- 0x71, 0xe2, 0x0b, 0x51, 0xe1, 0x47, 0x0b, 0xb8,
- 0xe0, 0x2c, 0xec, 0x7c, 0xf4, 0x8c, 0x63, 0x51,
- 0x8c, 0xdd, 0x0b, 0x50, 0xb8, 0xcf, 0x81, 0x40,
- 0x01, 0x0d, 0x10, 0x5d, 0x91, 0x01, 0x3f, 0xec,
- 0x75, 0x7d, 0xd7, 0x97, 0x97, 0x3c, 0x74, 0xfe,
- 0x1e, 0xe7, 0x15, 0xb8, 0x27, 0x4f, 0x9f, 0xd7,
- 0x88, 0x0e, 0x9f, 0xb1, 0xef, 0xaa, 0x5e, 0xce,
- 0x8d, 0xa2, 0x2f, 0xcd, 0x3a, 0x4f, 0x3b, 0xc5,
- 0xe3, 0xa6, 0x02, 0x1d, 0x3d, 0xb4, 0x56, 0x1d,
- 0x07, 0x4f, 0xdf, 0x7f, 0x48, 0x20, 0x3a, 0x38,
- 0x36, 0xfd, 0x0a, 0x9f, 0xff, 0xc9, 0xbe, 0x3a,
- 0x97, 0x36, 0xb1, 0xb8, 0x46, 0xe6, 0xa3, 0xa6,
- 0x02, 0x1d, 0x32, 0x5f, 0x3a, 0x7f, 0xb3, 0x54,
- 0x45, 0x73, 0xc5, 0x8e, 0x9f, 0xd4, 0xca, 0xee,
- 0x97, 0x3c, 0x74, 0xc1, 0x09, 0x53, 0xfd, 0xdc,
- 0x5d, 0xee, 0xa6, 0xf8, 0x3a, 0x19, 0x3f, 0x7d,
- 0x8d, 0x88, 0xaa, 0x95, 0xea, 0x44, 0x06, 0x25,
- 0xec, 0x57, 0xa2, 0xf4, 0x3a, 0x09, 0xaf, 0x31,
- 0x69, 0xc1, 0x08, 0x4a, 0x92, 0x8a, 0xb1, 0x79,
- 0x3e, 0xf5, 0xbf, 0xc4, 0xab, 0x23, 0x67, 0x9c,
- 0x2e, 0xa7, 0xf3, 0xfa, 0x4c, 0xae, 0x3c, 0x74,
- 0x23, 0x63, 0x2f, 0x91, 0x98, 0x5f, 0x3c, 0x7c,
- 0xc7, 0x71, 0xaa, 0xd6, 0x1e, 0x7f, 0x49, 0x1e,
- 0xea, 0x35, 0x21, 0xa3, 0x74, 0xaf, 0xf5, 0xc9,
- 0x73, 0xd8, 0xc9, 0xa3, 0xa7, 0xb1, 0x59, 0xa3,
- 0xa7, 0xbd, 0xee, 0x6e, 0x3a, 0x10, 0xf8, 0xdf,
- 0x1f, 0xbc, 0x20, 0x9f, 0xbb, 0x77, 0x0a, 0xf7,
- 0x1d, 0x3f, 0xfc, 0xfb, 0xba, 0x9c, 0x95, 0xd4,
- 0xbf, 0xad, 0xbc, 0x74, 0x22, 0x21, 0x76, 0x5f,
- 0x3d, 0xcb, 0xf9, 0x73, 0x3a, 0x7e, 0x79, 0x67,
- 0x2f, 0x05, 0xe3, 0xa6, 0x73, 0xc7, 0x4f, 0xab,
- 0x9b, 0x75, 0x0e, 0x9f, 0xfe, 0xaa, 0x73, 0xb6,
- 0xbb, 0xe0, 0xa5, 0x10, 0x05, 0x4f, 0xe0, 0x60,
- 0xb7, 0xfb, 0x1e, 0x20, 0x48, 0x72, 0x2c, 0xf8,
- 0x27, 0x15, 0x19, 0xed, 0x3d, 0xfd, 0x3a, 0x79,
- 0xfa, 0x7e, 0x8e, 0x8c, 0x3c, 0x4a, 0x91, 0x4f,
- 0xee, 0xf8, 0x69, 0x44, 0x01, 0xd3, 0x82, 0x10,
- 0x9f, 0x0f, 0xa9, 0xdf, 0xde, 0x0b, 0x87, 0xd5,
- 0x8d, 0x4c, 0x70, 0x89, 0x40, 0x2d, 0xcf, 0xff,
- 0xb3, 0xbb, 0xbf, 0x6a, 0x6a, 0xb7, 0x7b, 0x9c,
- 0x87, 0x43, 0xc7, 0xf9, 0x7c, 0x92, 0x17, 0xaa,
- 0xac, 0x87, 0x1a, 0x64, 0x32, 0xb6, 0xe9, 0xf1,
- 0x98, 0xcf, 0xb7, 0xa4, 0xd5, 0x0a, 0x9e, 0x64,
- 0xd5, 0x0a, 0x98, 0x21, 0x2a, 0x1c, 0x7b, 0xb8,
- 0x4e, 0x12, 0x09, 0xb0, 0x25, 0x58, 0xd7, 0x4f,
- 0xff, 0xb3, 0x48, 0xd9, 0x9d, 0xd5, 0x76, 0x9d,
- 0x78, 0xe8, 0x01, 0xfc, 0x04, 0x96, 0x7f, 0xff,
- 0x22, 0xed, 0xf4, 0x1c, 0xb5, 0x4c, 0x6a, 0xff,
- 0x75, 0x43, 0xa7, 0xf2, 0xcf, 0xba, 0xb7, 0x20,
- 0x9d, 0x39, 0xde, 0x27, 0x4f, 0x9d, 0x9a, 0xce,
- 0x0a, 0x96, 0xd6, 0x3c, 0x1d, 0x0d, 0x4c, 0x04,
- 0x3a, 0x60, 0x21, 0xd3, 0xf7, 0x6e, 0x76, 0x76,
- 0xdb, 0x35, 0x40, 0x15, 0x9f, 0xfb, 0x55, 0xc5,
- 0x73, 0x40, 0x63, 0xfa, 0x3a, 0x7f, 0x3e, 0xdb,
- 0x1e, 0x69, 0xc1, 0xd3, 0xc0, 0x57, 0xba, 0x87,
- 0xf7, 0xa4, 0x69, 0xcb, 0xf8, 0xf9, 0xd0, 0x87,
- 0xb1, 0xe7, 0x33, 0x82, 0x10, 0x95, 0x3f, 0x26,
- 0x5f, 0xed, 0xd4, 0x2a, 0xc5, 0xe4, 0xf0, 0x7f,
- 0xae, 0x3a, 0x66, 0xa9, 0xd3, 0x82, 0x10, 0x95,
- 0x3f, 0x6f, 0xef, 0xd7, 0x7a, 0x2a, 0xc5, 0xe4,
- 0xfb, 0x01, 0x98, 0xb1, 0xd2, 0xa7, 0x24, 0x4a,
- 0x89, 0x8f, 0x4f, 0xa7, 0xb7, 0xdb, 0x9d, 0xc2,
- 0x3b, 0x72, 0x16, 0xd0, 0x8b, 0x81, 0xee, 0x22,
- 0xc6, 0x4b, 0xee, 0xc2, 0xa7, 0x58, 0xc6, 0x28,
- 0x79, 0xa8, 0xca, 0xe7, 0xe4, 0x50, 0x8f, 0xe8,
- 0xe9, 0xff, 0xed, 0xa9, 0xf7, 0x53, 0x96, 0x77,
- 0xb9, 0xb0, 0x1d, 0x15, 0x3f, 0xdd, 0x15, 0x4a,
- 0xcb, 0xd1, 0xfc, 0x8a, 0x12, 0x50, 0x9b, 0xd1,
- 0x88, 0xba, 0x50, 0x67, 0x12, 0x96, 0x32, 0xb4,
- 0xf4, 0xbf, 0x19, 0xab, 0x47, 0x4a, 0xfc, 0xa2,
- 0x3d, 0xc2, 0x71, 0x68, 0xf3, 0x86, 0x71, 0xf1,
- 0x51, 0xb9, 0x56, 0x74, 0x5b, 0xe9, 0xbf, 0x40,
- 0x94, 0x49, 0xd9, 0xcb, 0xda, 0x53, 0xf1, 0x35,
- 0x59, 0x93, 0x5d, 0x19, 0x4a, 0xe8, 0x5b, 0x84,
- 0x89, 0x7e, 0x57, 0x7f, 0x39, 0xd6, 0xdb, 0xc8,
- 0x7e, 0x45, 0x9f, 0xd2, 0x11, 0xd7, 0xe4, 0xe9,
- 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0xb8, 0xe7,
- 0xf5, 0xb0, 0x5b, 0xfd, 0x8d, 0x17, 0x5c, 0xff,
- 0xd6, 0xf7, 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x28,
- 0xc2, 0x3f, 0xbe, 0xbb, 0x8a, 0x38, 0x3b, 0xbe,
- 0x76, 0xc7, 0x7b, 0x87, 0x85, 0xed, 0x03, 0xef,
- 0xd3, 0x5a, 0x86, 0xda, 0x3b, 0xbc, 0x3b, 0x9f,
- 0xfd, 0x65, 0x7b, 0xad, 0x82, 0xdf, 0xec, 0x68,
- 0x96, 0xa7, 0xc2, 0xdf, 0xec, 0x68, 0x8d, 0xe7,
- 0xfd, 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x5f,
- 0x95, 0xb0, 0xfd, 0x94, 0x61, 0x3f, 0xad, 0x82,
- 0xdf, 0xec, 0x68, 0xaa, 0xe7, 0xfa, 0xfe, 0x77,
- 0x1f, 0xd7, 0xa8, 0xe9, 0xb8, 0xd9, 0xd3, 0xf6,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x40, 0x8e, 0x47, 0x99,
- 0x61, 0x79, 0xf5, 0x3f, 0xbe, 0xf9, 0xd0, 0xe3,
- 0xcb, 0x7c, 0x92, 0x2f, 0xa3, 0xd3, 0xe1, 0xa3,
- 0x3f, 0xf7, 0x71, 0xeb, 0x2f, 0xa7, 0x7b, 0x9a,
- 0x3a, 0x2c, 0x7e, 0x02, 0x53, 0x3f, 0xad, 0x82,
- 0xdf, 0xec, 0x68, 0xb2, 0x27, 0xf5, 0xb0, 0x5b,
- 0xfd, 0x8d, 0x16, 0xbc, 0xfe, 0xb6, 0x0b, 0x7f,
- 0xb1, 0xa2, 0xe4, 0x9f, 0x0b, 0x7f, 0xb1, 0xa2,
- 0xec, 0x9f, 0xf7, 0xba, 0xd8, 0x2d, 0xfe, 0xc6,
- 0x8a, 0x3a, 0x56, 0xc3, 0xf6, 0x51, 0x84, 0xf8,
- 0x5b, 0xfd, 0x8d, 0x14, 0xac, 0xff, 0xff, 0xf5,
- 0x51, 0xe4, 0xae, 0xd7, 0x7f, 0x15, 0xdd, 0x9a,
- 0xbb, 0x5a, 0xa8, 0xf6, 0x1d, 0x3e, 0xb2, 0xbd,
- 0xd6, 0xc4, 0x59, 0x2c, 0x61, 0x0f, 0x2e, 0x77,
- 0xba, 0x19, 0x0f, 0x93, 0xee, 0x39, 0xf5, 0x10,
- 0x80, 0xee, 0x87, 0x7a, 0x85, 0x8a, 0xe8, 0x6c,
- 0xcf, 0xf3, 0xad, 0x82, 0xdf, 0xec, 0x68, 0x8e,
- 0x27, 0xfb, 0x76, 0xc1, 0x6f, 0xf6, 0x34, 0x56,
- 0xb2, 0xb7, 0xa2, 0x0b, 0x48, 0x33, 0xff, 0xac,
- 0xaf, 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x12, 0xdc,
- 0xd8, 0xf9, 0xd3, 0xfb, 0x8c, 0x52, 0x93, 0x74,
- 0x3a, 0x1f, 0x3c, 0x9d, 0x8b, 0x4e, 0xaf, 0x0e,
- 0x3a, 0x73, 0x94, 0xc7, 0x41, 0xa2, 0x1b, 0x9f,
- 0xf7, 0xba, 0xd8, 0x2d, 0xfe, 0xc6, 0x89, 0x82,
- 0x70, 0xdc, 0x02, 0xa5, 0x64, 0x46, 0xa3, 0xc4,
- 0x7c, 0x0e, 0xb0, 0xda, 0x85, 0xf4, 0x8d, 0x39,
- 0x57, 0x09, 0x53, 0xfe, 0xf7, 0x5b, 0x05, 0xbf,
- 0xd8, 0xd1, 0x31, 0xca, 0xdb, 0x3e, 0x25, 0x0e,
- 0x4f, 0xc9, 0x4e, 0x5a, 0xca, 0x9d, 0x3f, 0xff,
- 0xfc, 0xea, 0x57, 0x2e, 0x0d, 0x2b, 0x8d, 0x94,
- 0xe5, 0x8f, 0xba, 0x9b, 0xee, 0xce, 0x9e, 0x6f,
- 0xf6, 0x34, 0x56, 0x33, 0xfe, 0x5f, 0xcd, 0x77,
- 0x2e, 0x4e, 0xe8, 0xe8, 0xbe, 0x98, 0xdb, 0xe5,
- 0xc3, 0x08, 0x1d, 0x15, 0xcf, 0xfe, 0x4e, 0xea,
- 0xfd, 0xc9, 0xdc, 0x64, 0x13, 0xa7, 0xfd, 0x9c,
- 0x57, 0x28, 0xfb, 0x92, 0xa7, 0x4f, 0xff, 0xfd,
- 0xdb, 0x9e, 0xc6, 0xe5, 0xdb, 0xaf, 0x39, 0x63,
- 0xee, 0xcb, 0xba, 0x0a, 0x1d, 0x3f, 0x97, 0xab,
- 0xcb, 0x39, 0x78, 0x2f, 0x1d, 0x3a, 0xbb, 0xb6,
- 0x27, 0x16, 0xc8, 0xb5, 0x49, 0xd1, 0xfa, 0xfb,
- 0xf4, 0xd7, 0x2c, 0x74, 0xfb, 0xfa, 0xf5, 0xd4,
- 0x3a, 0x3a, 0x78, 0x34, 0x18, 0x9f, 0x06, 0x94,
- 0x40, 0x1d, 0x3e, 0x47, 0x02, 0xe7, 0x1d, 0x39,
- 0x3a, 0xe3, 0xa1, 0x63, 0xc3, 0xd1, 0x44, 0xfc,
- 0x8a, 0xce, 0xee, 0xf9, 0xd2, 0xa1, 0xd1, 0xb3,
- 0x7d, 0xe5, 0xd3, 0x01, 0x0a, 0x98, 0x21, 0x2a,
- 0x36, 0x6a, 0xc2, 0x2b, 0x3f, 0xbd, 0xdd, 0xcd,
- 0x57, 0x65, 0x58, 0xd0, 0xcf, 0x71, 0xef, 0xd0,
- 0xe9, 0xc9, 0xd5, 0x8e, 0x9b, 0xa8, 0x74, 0x2c,
- 0x6c, 0x44, 0x72, 0x78, 0x41, 0x97, 0x87, 0x4e,
- 0xe6, 0x37, 0xce, 0x84, 0x45, 0xbe, 0x2a, 0x6c,
- 0x86, 0xa4, 0x73, 0x57, 0x47, 0x4e, 0x08, 0x42,
- 0x54, 0xff, 0xd8, 0xdc, 0x23, 0xdc, 0xf2, 0xbe,
- 0xf9, 0x56, 0x2f, 0x27, 0xeb, 0x95, 0xbd, 0x03,
- 0xce, 0x9f, 0xcd, 0xba, 0x77, 0x17, 0x79, 0xd3,
- 0x66, 0x8e, 0x87, 0xcf, 0x22, 0xa6, 0x73, 0xff,
- 0xda, 0xdd, 0x2b, 0x9c, 0x77, 0x17, 0x77, 0x28,
- 0x74, 0xac, 0x8a, 0xff, 0xf8, 0x22, 0xc6, 0xa1,
- 0x61, 0x53, 0x65, 0x61, 0xf3, 0xe7, 0x7d, 0x32,
- 0xa2, 0xae, 0x9d, 0xb9, 0x91, 0xcf, 0x85, 0xbf,
- 0xd8, 0xd1, 0x5b, 0xcf, 0xfb, 0xdd, 0x6c, 0x16,
- 0xff, 0x63, 0x44, 0xe1, 0x2b, 0x61, 0xfb, 0x28,
- 0xc2, 0x7c, 0x2d, 0xfe, 0xc6, 0x8b, 0x46, 0x7b,
- 0x16, 0xdd, 0xf3, 0xa5, 0x6c, 0x3d, 0x4a, 0x98,
- 0x4f, 0x37, 0xfb, 0x1a, 0x2d, 0xa9, 0xfa, 0xa8,
- 0xa4, 0xdf, 0x07, 0x4d, 0x6c, 0x13, 0xd8, 0xd1,
- 0x5c, 0xfe, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0xe5,
- 0x9f, 0xd6, 0xc1, 0x6f, 0xf6, 0x34, 0x5d, 0xb0,
- 0x8c, 0xc7, 0x87, 0x8a, 0x1d, 0x1b, 0x7f, 0x10,
- 0xbf, 0xbf, 0x2b, 0x3b, 0x73, 0x93, 0xd7, 0xb8,
- 0xc6, 0xaa, 0xf7, 0xd7, 0xfa, 0x16, 0x68, 0xee,
- 0x7f, 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x53, 0xcf,
- 0x37, 0xfb, 0x1a, 0x2b, 0x99, 0xfd, 0x6c, 0x16,
- 0xff, 0x63, 0x45, 0x9d, 0x02, 0x7c, 0xd5, 0x2b,
- 0x9f, 0xe7, 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x21,
- 0x4f, 0x2f, 0x4a, 0xa2, 0x8e, 0x9f, 0xd9, 0x5a,
- 0x53, 0x05, 0xe3, 0xa5, 0x6c, 0x45, 0xdf, 0x90,
- 0xd1, 0x07, 0x44, 0xf3, 0xff, 0xac, 0xaf, 0x75,
- 0xb0, 0x5b, 0xfd, 0x8d, 0x13, 0xe4, 0x32, 0x7d,
- 0xf7, 0xb8, 0xd7, 0x2a, 0x83, 0x3e, 0x16, 0xff,
- 0x63, 0x45, 0x65, 0x3f, 0xef, 0x75, 0xb0, 0x5b,
- 0xfd, 0x8d, 0x13, 0x74, 0xdb, 0xb6, 0x1f, 0xb2,
- 0x8c, 0x27, 0xff, 0x59, 0x5e, 0xeb, 0x60, 0xb7,
- 0xfb, 0x1a, 0x25, 0x69, 0xf0, 0xb7, 0xfb, 0x1a,
- 0x25, 0xc9, 0xe5, 0xdb, 0xea, 0x1d, 0x3e, 0xb2,
- 0xbd, 0xd6, 0xc3, 0xd3, 0xf3, 0x09, 0xff, 0xad,
- 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x3b, 0x9f,
- 0xed, 0x57, 0x1d, 0x6f, 0xed, 0x0e, 0x9f, 0x97,
- 0x9d, 0x46, 0xce, 0x9d, 0x3f, 0x5e, 0xbd, 0xca,
- 0xfe, 0x8e, 0x9f, 0x0b, 0x7f, 0xb1, 0xa2, 0xa1,
- 0x9f, 0x65, 0x75, 0x8f, 0x1d, 0x2b, 0x5e, 0xa8,
- 0xb7, 0x5e, 0x17, 0xe1, 0x8e, 0x8c, 0x27, 0xc2,
- 0xdf, 0xec, 0x68, 0xaa, 0x27, 0xfd, 0xee, 0xb6,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x6b, 0x95, 0xb0, 0xfd,
- 0x94, 0x61, 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68,
- 0xab, 0x27, 0xfe, 0xb7, 0xba, 0xd8, 0x2d, 0xfe,
- 0xc6, 0x89, 0x12, 0x7c, 0x2d, 0xfe, 0xc6, 0x8b,
- 0x4a, 0x7f, 0xde, 0xeb, 0x60, 0xb7, 0xfb, 0x1a,
- 0x27, 0xd9, 0x5b, 0x0f, 0xd9, 0x46, 0x13, 0xff,
- 0xac, 0xaf, 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x14,
- 0x24, 0xfa, 0xbb, 0x79, 0x04, 0xe9, 0xf0, 0xb7,
- 0xfb, 0x1a, 0x28, 0xf9, 0xff, 0xfb, 0x38, 0xaa,
- 0x73, 0xb6, 0xbb, 0xe0, 0xa5, 0x10, 0x05, 0x4f,
- 0xac, 0xaf, 0x75, 0x91, 0x16, 0x98, 0x4e, 0xbe,
- 0x61, 0x08, 0xba, 0xfa, 0xf4, 0x29, 0x5c, 0x7b,
- 0x89, 0x97, 0xe1, 0xde, 0xd0, 0xc1, 0x7c, 0x9d,
- 0x63, 0xba, 0xc3, 0x08, 0x04, 0xfa, 0x8c, 0x1a,
- 0x7f, 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x11, 0x4f,
- 0xd8, 0x2d, 0xfe, 0xc6, 0x88, 0xae, 0x7f, 0xaf,
- 0x76, 0xc1, 0x6f, 0xf6, 0x34, 0x57, 0x11, 0x63,
- 0xfa, 0xf3, 0x59, 0xec, 0xaf, 0xe8, 0xe9, 0xfd,
- 0x9b, 0x10, 0x02, 0xea, 0x1d, 0x2b, 0xd7, 0xa7,
- 0xa7, 0x42, 0x09, 0xff, 0xbf, 0x6e, 0xdf, 0x75,
- 0x75, 0x47, 0x0e, 0x9f, 0x66, 0xf8, 0x1c, 0x3a,
- 0x76, 0xa9, 0xba, 0x9f, 0x56, 0x91, 0x27, 0xc2,
- 0xdf, 0xec, 0x68, 0xa7, 0xa1, 0x78, 0x8f, 0xb4,
- 0x84, 0xbe, 0x1a, 0x4f, 0xfe, 0xf7, 0x5b, 0x8e,
- 0xf8, 0x69, 0x44, 0x01, 0xd1, 0x64, 0x40, 0xf0,
- 0x6f, 0x3a, 0xdc, 0x61, 0xd3, 0xe4, 0x70, 0x2e,
- 0x71, 0xd3, 0xcd, 0xfe, 0xc6, 0x8a, 0xce, 0x16,
- 0x3d, 0x31, 0x28, 0x9f, 0x9e, 0x52, 0x75, 0xd4,
- 0x3a, 0x72, 0x3d, 0xb3, 0xa7, 0xda, 0x07, 0x3e,
- 0xb8, 0xe9, 0xf6, 0x2c, 0xf5, 0xc0, 0x3a, 0x56,
- 0xc4, 0x60, 0x09, 0x15, 0x4b, 0xbc, 0x73, 0x99,
- 0x54, 0xff, 0xd6, 0xf7, 0x5b, 0x05, 0xbf, 0xd8,
- 0xd1, 0x22, 0xcf, 0xeb, 0x60, 0xb7, 0xfb, 0x1a,
- 0x2c, 0x99, 0xfd, 0x6c, 0x16, 0xff, 0x63, 0x45,
- 0xb1, 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0xb6,
- 0xe7, 0xfc, 0xbc, 0x5e, 0x5e, 0x96, 0xab, 0x9d,
- 0x40, 0x1d, 0x3f, 0x27, 0x5d, 0xc5, 0xca, 0x3a,
- 0x7c, 0x2d, 0xfe, 0xc6, 0x8b, 0xc2, 0x7b, 0x4b,
- 0xf9, 0x53, 0xa7, 0xd9, 0xd0, 0x5e, 0x21, 0xd3,
- 0xe4, 0xe7, 0x77, 0xd0, 0xe9, 0xda, 0x40, 0x1d,
- 0x2b, 0x5e, 0x9a, 0x99, 0xeb, 0xc9, 0xb8, 0x5e,
- 0xf9, 0x80, 0x09, 0x3a, 0x53, 0xa2, 0x99, 0xf0,
- 0xb7, 0xfb, 0x1a, 0x2f, 0x49, 0xff, 0x77, 0xf4,
- 0xe4, 0xbf, 0xad, 0xbc, 0x74, 0xfb, 0x15, 0x5f,
- 0xe0, 0xe9, 0x5b, 0x11, 0x31, 0xcc, 0xc2, 0xf1,
- 0x06, 0x11, 0x7f, 0x21, 0xe8, 0x5a, 0xe4, 0x7e,
- 0x0c, 0x49, 0xb8, 0xcb, 0xc5, 0x3d, 0x49, 0x80,
- 0x3b, 0xe9, 0xdd, 0xd1, 0xbc, 0x06, 0x30, 0xd9,
- 0xec, 0xaf, 0xe8, 0xe9, 0xfd, 0x9b, 0x10, 0x02,
- 0xea, 0x1d, 0x2b, 0xd7, 0xa7, 0xa7, 0x42, 0x09,
- 0xf0, 0xb7, 0xfb, 0x1a, 0x22, 0x39, 0xff, 0xea,
- 0xdd, 0x4a, 0x62, 0xbb, 0x8b, 0xb9, 0x25, 0xe8,
- 0x3a, 0x7f, 0xce, 0x47, 0x87, 0x35, 0xad, 0xe8,
- 0xe9, 0x9e, 0x51, 0x53, 0x04, 0x25, 0x4f, 0xfc,
- 0xeb, 0x35, 0x76, 0xb5, 0x51, 0xeb, 0x00, 0xd6,
- 0x84, 0x5e, 0x7f, 0x65, 0xef, 0xb9, 0x5f, 0xd1,
- 0xd3, 0xff, 0xf3, 0x58, 0x7f, 0xbb, 0xd5, 0x85,
- 0x35, 0xdf, 0x01, 0xd0, 0xbc, 0x54, 0x19, 0x85,
- 0xac, 0x60, 0xfa, 0xd7, 0xb5, 0xe9, 0x75, 0x71,
- 0xac, 0xf8, 0x5b, 0xfd, 0x8d, 0x11, 0x74, 0xfb,
- 0x40, 0xe7, 0xd7, 0x16, 0xcf, 0x69, 0x5b, 0x0f,
- 0x9f, 0xcc, 0x22, 0xc8, 0xf7, 0x74, 0x34, 0x67,
- 0xfe, 0x57, 0xba, 0xd8, 0x2d, 0xfe, 0xc6, 0x89,
- 0x9a, 0x73, 0xe9, 0x43, 0xa7, 0x36, 0xd4, 0x74,
- 0xff, 0xec, 0xbc, 0xde, 0xb6, 0xdb, 0xe3, 0x58,
- 0xc7, 0x4f, 0xff, 0xb8, 0xdf, 0x5e, 0xca, 0x6f,
- 0xeb, 0x60, 0x84, 0x25, 0x4f, 0x37, 0xfb, 0x1a,
- 0x2c, 0xf9, 0xff, 0xed, 0x8d, 0x7f, 0x96, 0x2e,
- 0xee, 0x53, 0x3a, 0x74, 0xe0, 0x84, 0x25, 0x4f,
- 0xfb, 0xdd, 0x4e, 0xe3, 0x71, 0x82, 0x55, 0x8b,
- 0xc9, 0xfe, 0x4a, 0xef, 0x8e, 0xff, 0xac, 0x74,
- 0xff, 0x6f, 0xbc, 0x73, 0xe2, 0xed, 0x50, 0xe8,
- 0x64, 0xec, 0xc5, 0x62, 0xa5, 0x60, 0x6d, 0xd2,
- 0x5a, 0xe3, 0x99, 0xff, 0xff, 0xfb, 0x30, 0x14,
- 0xcc, 0xed, 0xfe, 0x63, 0xd4, 0xca, 0xda, 0x9d,
- 0xc7, 0x95, 0x8a, 0x3a, 0x75, 0x11, 0xe3, 0xa7,
- 0x2f, 0xe5, 0x4e, 0x87, 0x23, 0x12, 0x90, 0x8a,
- 0xd0, 0xe4, 0xf3, 0xe0, 0xb9, 0x8e, 0x9f, 0x57,
- 0xa9, 0x82, 0x64, 0xff, 0xb6, 0x2e, 0xc1, 0x7a,
- 0xef, 0xe0, 0xd1, 0x06, 0xd8, 0xd2, 0xcf, 0xbd,
- 0xb6, 0xa4, 0x3a, 0x7e, 0x75, 0x7b, 0xef, 0xe8,
- 0xe9, 0x63, 0x1e, 0x9f, 0x49, 0x67, 0xff, 0xfd,
- 0xe1, 0xd6, 0x57, 0x49, 0x9d, 0x7f, 0x58, 0x3b,
- 0x7b, 0xd4, 0x74, 0x39, 0x34, 0x0c, 0x85, 0x7f,
- 0x49, 0xa7, 0xe1, 0xce, 0x29, 0x54, 0x3a, 0x7f,
- 0xff, 0x5d, 0xdf, 0xbf, 0xcb, 0x9f, 0x7f, 0x54,
- 0xdb, 0xf5, 0xd8, 0x4e, 0x9f, 0xff, 0xea, 0x51,
- 0x07, 0x49, 0x65, 0x66, 0xa9, 0xce, 0x9e, 0xec,
- 0x3a, 0x7a, 0xb9, 0xb5, 0xc7, 0x46, 0xd1, 0x13,
- 0x56, 0x69, 0x95, 0x7a, 0x9a, 0x2f, 0xc9, 0xff,
- 0x9d, 0xab, 0x9c, 0xe5, 0x6b, 0x48, 0xa3, 0xa7,
- 0xfe, 0xde, 0x77, 0x32, 0x9c, 0x9d, 0x45, 0x1d,
- 0x0f, 0xa2, 0x2e, 0x88, 0xd3, 0xdd, 0xea, 0x31,
- 0xd0, 0x89, 0x8d, 0x70, 0x47, 0x90, 0xb3, 0xf2,
- 0x49, 0xff, 0xff, 0xaf, 0x12, 0xbb, 0x55, 0x96,
- 0x77, 0x8f, 0x3a, 0xed, 0xfa, 0x36, 0xde, 0x3a,
- 0x7d, 0x76, 0x53, 0x7d, 0x3a, 0x7c, 0x9c, 0xee,
- 0xfa, 0x1d, 0x32, 0xf6, 0xa3, 0xa7, 0xff, 0xfd,
- 0x5d, 0xbf, 0xac, 0x7f, 0x42, 0x29, 0xa0, 0x73,
- 0xeb, 0xab, 0x87, 0x4e, 0x08, 0x42, 0x54, 0xf7,
- 0x1c, 0x7f, 0x4a, 0xb1, 0x79, 0x08, 0x8d, 0x86,
- 0x1b, 0xdc, 0x22, 0xe7, 0xfe, 0xce, 0xbf, 0xac,
- 0x1d, 0xbd, 0xea, 0x3a, 0x7d, 0x9a, 0x72, 0xaa,
- 0x74, 0x21, 0xf5, 0xd1, 0x12, 0x60, 0x54, 0xe9,
- 0xf9, 0xe5, 0x9c, 0xbc, 0x17, 0x8e, 0x9f, 0xd7,
- 0xeb, 0x9a, 0xae, 0xf4, 0x74, 0xdb, 0x13, 0xa1,
- 0x7a, 0x9f, 0xf6, 0xcd, 0x2a, 0x6b, 0x3f, 0xfb,
- 0x8e, 0x13, 0x81, 0x4d, 0x6d, 0xb7, 0xc1, 0xd2,
- 0xb2, 0xf4, 0x65, 0x9a, 0xde, 0x90, 0xe7, 0x03,
- 0x79, 0x1f, 0xfb, 0xf1, 0x8e, 0x6c, 0xd5, 0x68,
- 0xe2, 0x04, 0xd5, 0x45, 0x95, 0x94, 0x1b, 0xe8,
- 0x20, 0x7a, 0xe9, 0x45, 0x23, 0x01, 0xd4, 0x27,
- 0x82, 0x42, 0xbf, 0x09, 0x4e, 0x66, 0xb1, 0x66,
- 0x65, 0xcd, 0x69, 0x70, 0x33, 0xff, 0xac, 0xaf,
- 0x75, 0xb0, 0x5b, 0xfd, 0x8d, 0x13, 0x64, 0xfe,
- 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0xad, 0x9f, 0xce,
- 0x75, 0xda, 0xea, 0x38, 0xe9, 0xec, 0xaf, 0xe8,
- 0xe9, 0x5e, 0xb8, 0x7a, 0x9d, 0x34, 0x9f, 0x0b,
- 0x7f, 0xb1, 0xa2, 0xb4, 0x9f, 0xfe, 0x64, 0x1c,
- 0x07, 0xab, 0xdc, 0x9b, 0x63, 0xa7, 0xff, 0x9d,
- 0x4c, 0xea, 0x2b, 0xf3, 0x5a, 0x45, 0x1d, 0x36,
- 0xb4, 0x88, 0x97, 0xf4, 0xa9, 0xfc, 0x8b, 0xb9,
- 0xeb, 0xa8, 0x03, 0xa7, 0xe7, 0xb2, 0xbb, 0xc5,
- 0x1d, 0x3f, 0xd9, 0x79, 0xd4, 0x0b, 0xee, 0xa1,
- 0xd3, 0xf9, 0xd9, 0xaf, 0xe8, 0x2e, 0x3a, 0x56,
- 0x5e, 0x27, 0xe5, 0x85, 0x9b, 0x86, 0x3d, 0x4b,
- 0x7c, 0xdb, 0xa5, 0xba, 0x3c, 0x9f, 0xd6, 0xc1,
- 0x6f, 0xf6, 0x34, 0x58, 0x13, 0xe1, 0x6f, 0xf6,
- 0x34, 0x4e, 0xb3, 0xff, 0xfa, 0xa8, 0xf7, 0x18,
- 0xab, 0x52, 0x99, 0x5d, 0xd2, 0xe7, 0x8e, 0x9f,
- 0x59, 0x5e, 0xeb, 0x62, 0x25, 0x56, 0x30, 0x9f,
- 0x0b, 0x7f, 0xb1, 0xa2, 0xd9, 0x9f, 0xf0, 0x12,
- 0x96, 0xae, 0xdb, 0xc4, 0xe9, 0x5b, 0x0f, 0xb3,
- 0xcc, 0x27, 0x9b, 0xfd, 0x8d, 0x17, 0x34, 0x94,
- 0x74, 0xd6, 0xc1, 0x37, 0x61, 0x2b, 0x9f, 0xd6,
- 0xc1, 0x6f, 0xf6, 0x34, 0x5d, 0xf3, 0xd6, 0xbf,
- 0xc0, 0x0e, 0x84, 0x6c, 0xaf, 0xb2, 0x99, 0xc2,
- 0xc6, 0x0f, 0xa9, 0x6e, 0x54, 0x08, 0xb9, 0x2a,
- 0x1a, 0x00, 0x85, 0x65, 0x18, 0x74, 0x57, 0xcc,
- 0xee, 0x7f, 0x75, 0xec, 0xbc, 0xd2, 0x5f, 0x3a,
- 0x7c, 0x2d, 0xfe, 0xc6, 0x89, 0x5e, 0x7e, 0xaf,
- 0x17, 0x78, 0xb8, 0xe9, 0xde, 0xeb, 0x22, 0x25,
- 0xb0, 0xe2, 0x86, 0x13, 0xb4, 0x9c, 0x15, 0x3f,
- 0xfa, 0xbf, 0xbd, 0x23, 0xb6, 0x2f, 0x5c, 0x02,
- 0xa7, 0xf7, 0xb5, 0xb8, 0x15, 0xee, 0xc8, 0x7c,
- 0xf4, 0x1c, 0x95, 0x94, 0x8f, 0x45, 0xd0, 0xa6,
- 0x9f, 0xfd, 0x65, 0x7b, 0xad, 0x82, 0xdf, 0xec,
- 0x68, 0x98, 0x67, 0xff, 0xec, 0xb7, 0x31, 0xf0,
- 0x5a, 0xfe, 0x9c, 0x14, 0xa3, 0x8e, 0x9f, 0xfa,
- 0xf5, 0xc7, 0xdd, 0x77, 0xeb, 0xa8, 0xe3, 0xa7,
- 0xfb, 0xa9, 0xef, 0x6a, 0xff, 0x89, 0xd3, 0xf2,
- 0x93, 0x3b, 0xa5, 0xf3, 0xa7, 0xc9, 0x9d, 0xd2,
- 0xf9, 0xd3, 0xf5, 0x77, 0xaa, 0x7b, 0xfc, 0x8f,
- 0x61, 0x45, 0xf3, 0xff, 0xfe, 0xee, 0x06, 0xf3,
- 0x59, 0x5e, 0x5d, 0xc7, 0xb7, 0x9d, 0x7d, 0xd4,
- 0x3a, 0x7e, 0x5d, 0xcf, 0x5d, 0x40, 0x1d, 0x3f,
- 0xf9, 0x34, 0x04, 0x76, 0x3f, 0xa7, 0xae, 0x09,
- 0xd0, 0x87, 0xfb, 0xb3, 0x19, 0xfa, 0x9b, 0xbe,
- 0xaf, 0xd1, 0xd3, 0xff, 0xfe, 0x1c, 0x5c, 0x9d,
- 0xd7, 0x2e, 0x7d, 0x4a, 0xfe, 0xf4, 0x9a, 0xa1,
- 0xd2, 0xc7, 0xd1, 0x3e, 0x25, 0xf3, 0xdf, 0xcf,
- 0x8c, 0x3a, 0x56, 0x5e, 0x2b, 0x1e, 0xe1, 0x29,
- 0xa1, 0x22, 0xb2, 0x45, 0x61, 0xe1, 0xd8, 0x60,
- 0x5c, 0x51, 0x3e, 0x16, 0xff, 0x63, 0x45, 0x5d,
- 0x3f, 0xce, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x3c,
- 0x95, 0xb0, 0xfc, 0x7c, 0xc2, 0x7f, 0x5b, 0x05,
- 0xbf, 0xd8, 0xd1, 0x60, 0xcf, 0xeb, 0x60, 0xb7,
- 0xfb, 0x1a, 0x2c, 0xa9, 0xfd, 0x6c, 0x16, 0xff,
- 0x63, 0x45, 0xa7, 0x3c, 0xdf, 0xec, 0x68, 0xb7,
- 0x27, 0xfe, 0x4c, 0x1c, 0xef, 0x2a, 0xe3, 0xe1,
- 0x3a, 0x04, 0xfb, 0xe8, 0x57, 0x3f, 0xef, 0x75,
- 0xb0, 0x5b, 0xfd, 0x8d, 0x14, 0x3c, 0xfd, 0xd5,
- 0xe6, 0x0a, 0x50, 0xe9, 0xff, 0xfb, 0x38, 0xaa,
- 0x73, 0xb6, 0xbb, 0xe0, 0xa5, 0x10, 0x05, 0x4a,
- 0xd8, 0x8f, 0x35, 0x10, 0xdc, 0x8c, 0xbe, 0x5f,
- 0x3f, 0xad, 0x82, 0xdf, 0xec, 0x68, 0xbc, 0xe1,
- 0x17, 0xea, 0x9c, 0x61, 0xc2, 0x96, 0x4b, 0x7c,
- 0x7e, 0x1e, 0x42, 0x4c, 0xa3, 0xba, 0x9d, 0xf6,
- 0x39, 0xd5, 0xc8, 0xd3, 0xfa, 0xd8, 0x2d, 0xfe,
- 0xc6, 0x8a, 0x5a, 0x7f, 0x5b, 0x05, 0xbf, 0xd8,
- 0xd1, 0x61, 0x4f, 0xeb, 0x60, 0xb7, 0xfb, 0x1a,
- 0x2c, 0xb9, 0xff, 0xd6, 0x57, 0xba, 0xd8, 0x2d,
- 0xfe, 0xc6, 0x8a, 0x32, 0x7f, 0x59, 0x17, 0x20,
- 0xa0, 0x0e, 0x87, 0x26, 0x6a, 0x27, 0x6a, 0x3b,
- 0xa1, 0xde, 0x94, 0xa7, 0xfe, 0xb7, 0xba, 0xd8,
- 0x2d, 0xfe, 0xc6, 0x88, 0xe6, 0x7f, 0xf5, 0x95,
- 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x72, 0x9f,
- 0xd6, 0xc1, 0x6f, 0xf6, 0x34, 0x59, 0x93, 0xfa,
- 0xd8, 0x2d, 0xfe, 0xc6, 0x8b, 0x76, 0x7f, 0xf5,
- 0x95, 0xee, 0xb6, 0x0b, 0x7f, 0xb1, 0xa2, 0x90,
- 0x9f, 0xfa, 0xde, 0xeb, 0x60, 0xb7, 0xfb, 0x1a,
- 0x25, 0x28, 0x79, 0x3b, 0x25, 0x93, 0x14, 0xa5,
- 0xd3, 0xbd, 0x1d, 0xde, 0x29, 0x4f, 0xfb, 0xdd,
- 0x6c, 0x16, 0xff, 0x63, 0x44, 0xed, 0x3f, 0xfe,
- 0xdf, 0x17, 0x29, 0x2f, 0x3f, 0x8e, 0xa7, 0x71,
- 0x8e, 0x99, 0x56, 0x52, 0x27, 0xfd, 0x1a, 0x7c,
- 0x2d, 0xfe, 0xc6, 0x88, 0xb2, 0x7f, 0xde, 0xeb,
- 0x60, 0xb7, 0xfb, 0x1a, 0x25, 0xd9, 0xff, 0xfb,
- 0x38, 0xaa, 0x73, 0xb6, 0xbb, 0xe0, 0xa5, 0x10,
- 0x05, 0x4a, 0xd8, 0x8d, 0x35, 0x18, 0x2f, 0xa3,
- 0x4f, 0xfe, 0xb2, 0xbd, 0xd6, 0xc1, 0x6f, 0xf6,
- 0x34, 0x4c, 0x53, 0xfa, 0xd8, 0x2d, 0xfe, 0xc6,
- 0x8a, 0xa6, 0x7f, 0xf5, 0x95, 0xee, 0xb6, 0x0b,
- 0x7f, 0xb1, 0xa2, 0x74, 0x9f, 0xdb, 0xf1, 0x47,
- 0x7a, 0xe3, 0xa7, 0xcb, 0x22, 0xc9, 0x43, 0xa7,
- 0xe0, 0xe6, 0xd7, 0x67, 0x4e, 0x9e, 0xdd, 0x52,
- 0xdb, 0x3d, 0x6a, 0x14, 0x4f, 0xfd, 0x75, 0x34,
- 0x8f, 0xda, 0xe5, 0xb6, 0xa3, 0xa1, 0x48, 0x82,
- 0xa9, 0xcc, 0xff, 0xbd, 0xd6, 0xc1, 0x6f, 0xf6,
- 0x34, 0x4e, 0xf3, 0xed, 0x5d, 0xea, 0xd9, 0x52,
- 0xb7, 0x09, 0xcd, 0xe4, 0x61, 0x4a, 0x23, 0xf4,
- 0x69, 0xff, 0xd6, 0x57, 0xba, 0xd8, 0x2d, 0xfe,
- 0xc6, 0x8a, 0x16, 0x7f, 0xf5, 0x95, 0xee, 0xb6,
- 0x0b, 0x7f, 0xb1, 0xa2, 0x92, 0x9f, 0xff, 0xd9,
- 0x4b, 0x73, 0xc5, 0xab, 0xea, 0xd5, 0x53, 0x57,
- 0x28, 0xe8, 0x79, 0x70, 0x0d, 0xc7, 0x0c, 0xa4,
- 0x27, 0x6a, 0x8f, 0xb4, 0x09, 0x37, 0x29, 0x2f,
- 0xa9, 0x4f, 0xeb, 0x60, 0xb7, 0xfb, 0x1a, 0x22,
- 0x49, 0xff, 0xd6, 0x57, 0xba, 0xd8, 0x2d, 0xfe,
- 0xc6, 0x89, 0x7a, 0x7c, 0x2d, 0xfe, 0xc6, 0x8a,
- 0x5e, 0x7f, 0x27, 0x17, 0x9b, 0x52, 0x50, 0xe9,
- 0x5b, 0x0f, 0x9b, 0x46, 0x13, 0xfa, 0xd8, 0x2d,
- 0xfe, 0xc6, 0x8a, 0x72, 0x7f, 0xdb, 0x1f, 0xa5,
- 0x73, 0x3a, 0xc7, 0x4f, 0xfb, 0x2a, 0x83, 0x96,
- 0x08, 0x42, 0x54, 0xdb, 0x09, 0xd3, 0x3d, 0x6e,
- 0x11, 0x1a, 0xbe, 0x77, 0x78, 0x79, 0x3e, 0x16,
- 0xff, 0x63, 0x45, 0x79, 0x3f, 0xff, 0x67, 0x15,
- 0x4e, 0x76, 0xd7, 0x7c, 0x14, 0xa2, 0x00, 0xa9,
- 0x5b, 0x11, 0x1a, 0xbe, 0x61, 0x3f, 0xf5, 0xbd,
- 0xd6, 0xc1, 0x6f, 0xf6, 0x34, 0x48, 0xf3, 0xb6,
- 0x04, 0x3a, 0x73, 0x62, 0x8a, 0xb1, 0x77, 0x3e,
- 0x16, 0xff, 0x63, 0x44, 0x91, 0x3d, 0x6f, 0x75,
- 0x90, 0xf6, 0x70, 0xa6, 0x7f, 0xeb, 0x7b, 0xad,
- 0x82, 0xdf, 0xec, 0x68, 0x92, 0xa7, 0xc2, 0xdf,
- 0xec, 0x68, 0xbc, 0x67, 0xeb, 0xba, 0xff, 0xbf,
- 0x43, 0xa7, 0xd4, 0xa6, 0xb1, 0x8e, 0x9f, 0xe7,
- 0x5b, 0x05, 0xbf, 0xd8, 0xd1, 0x26, 0xca, 0xd8,
- 0x8c, 0x77, 0xcc, 0x04, 0xc3, 0xc9, 0xa1, 0x17,
- 0x4a, 0x5e, 0x3b, 0x74, 0x2e, 0x38, 0x27, 0xdc,
- 0x32, 0x16, 0x86, 0x8a, 0x8a, 0xeb, 0x0c, 0x0d,
- 0x1b, 0xdd, 0x18, 0x9c, 0x24, 0x69, 0x1f, 0x6f,
- 0x47, 0x3a, 0xe8, 0xf2, 0x78, 0x8f, 0x6b, 0x2d,
- 0xb5, 0x2d, 0xf9, 0x4a, 0xcd, 0x5e, 0x95, 0x3f,
- 0x3c, 0x19, 0xb9, 0xcc, 0x4b, 0xdc, 0x76, 0x0b,
- 0x52, 0xc7, 0x06, 0x7e, 0xd9, 0x57, 0xf1, 0x51,
- 0x59, 0xda, 0x6f, 0xa6, 0xca, 0x02, 0x55, 0x92,
- 0xf7, 0x0b, 0x0e, 0xce, 0xd5, 0x52, 0x90, 0xff,
- 0xaa, 0xdb, 0x2a, 0xea, 0x4f, 0x52, 0xe8, 0xf5,
- 0x83, 0x1f, 0xe2, 0xfc, 0x3f, 0x39, 0xce, 0x82,
- 0x5e, 0x4e, 0xd3, 0x40,
+ 0xfe, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x25, 0x9f,
+ 0x0a, 0xf7, 0x29, 0xa2, 0x2d, 0x9b, 0x1f, 0x2a,
+ 0x48, 0x54, 0x80, 0x26, 0x94, 0x02, 0xd3, 0xfa,
+ 0xf8, 0x20, 0x67, 0xa8, 0x55, 0x4d, 0x34, 0xfc,
+ 0xeb, 0x79, 0xb6, 0x34, 0x74, 0x21, 0xf9, 0x72,
+ 0x14, 0xab, 0x89, 0x86, 0xb7, 0xc3, 0xb6, 0x7f,
+ 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x51, 0x4f, 0xff,
+ 0x5b, 0xd6, 0xae, 0xbc, 0xc7, 0xb6, 0x4c, 0xd8,
+ 0xe9, 0xf0, 0xaf, 0x72, 0x9a, 0x2b, 0xd9, 0xf7,
+ 0xb5, 0x17, 0x47, 0x8e, 0x95, 0x70, 0xf7, 0x04,
+ 0xc2, 0x7f, 0xea, 0xf3, 0xab, 0x82, 0xbd, 0xca,
+ 0x68, 0x91, 0xa7, 0xff, 0x55, 0x9c, 0xea, 0xe0,
+ 0xaf, 0x72, 0x9a, 0x27, 0x89, 0xff, 0xd5, 0x67,
+ 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0xfe, 0x7f,
+ 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2,
+ 0x86, 0x9f, 0xfd, 0x56, 0x73, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0xa2, 0x27, 0xfd, 0xce, 0xae, 0x0a,
+ 0xf7, 0x29, 0xa2, 0x91, 0x9f, 0xff, 0xb3, 0x6b,
+ 0x26, 0xfa, 0xdf, 0xfc, 0x0a, 0x51, 0x00, 0x54,
+ 0xaa, 0xc4, 0x51, 0xb7, 0xa3, 0x4f, 0xfd, 0x5e,
+ 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x84, 0x3c,
+ 0xba, 0x70, 0xe8, 0xd2, 0x14, 0xc7, 0x56, 0x76,
+ 0x30, 0xaf, 0x61, 0x35, 0x93, 0x00, 0xa4, 0xdd,
+ 0xa9, 0x51, 0x4b, 0x48, 0x7a, 0xea, 0x16, 0x4f,
+ 0xfe, 0xab, 0x39, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
+ 0x4e, 0x73, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57,
+ 0xb9, 0x4d, 0x14, 0x4c, 0xff, 0xc2, 0xea, 0xdb,
+ 0xd4, 0x69, 0xde, 0x01, 0xd0, 0x28, 0xea, 0xa2,
+ 0x96, 0x8a, 0x53, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6,
+ 0x88, 0x72, 0x7c, 0x2b, 0xdc, 0xa6, 0x88, 0xbe,
+ 0x7d, 0xd7, 0x72, 0x6b, 0x2a, 0x55, 0xc3, 0xd8,
+ 0xf9, 0x84, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
+ 0xee, 0x53, 0x44, 0xc9, 0x3f, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0xb7, 0xa7, 0xff, 0x55, 0x9c, 0xea,
+ 0xe0, 0xaf, 0x72, 0x9a, 0x29, 0x38, 0x44, 0xe6,
+ 0x5d, 0x09, 0x3c, 0x27, 0xa2, 0x93, 0x63, 0xb9,
+ 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x44, 0x3b, 0x3f,
+ 0xfa, 0xac, 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1,
+ 0x2c, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x23,
+ 0x09, 0xff, 0xab, 0xce, 0xae, 0x0a, 0xf7, 0x29,
+ 0xa2, 0x3d, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
+ 0x58, 0x73, 0xfa, 0xb8, 0x2b, 0xdc, 0xa6, 0x8b,
+ 0x9e, 0x11, 0x38, 0xa7, 0x8e, 0xdc, 0xa5, 0xe3,
+ 0xb6, 0x26, 0x5c, 0xee, 0x7f, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x0f, 0x4f, 0x85, 0x7b, 0x94, 0xd1,
+ 0x13, 0x4d, 0x76, 0x1d, 0x3f, 0xfb, 0x2d, 0xbd,
+ 0xea, 0x27, 0x9f, 0xba, 0x30, 0xe8, 0x7c, 0xf8,
+ 0xec, 0x2d, 0x3d, 0x7d, 0x3b, 0x79, 0xa2, 0x17,
+ 0x95, 0x71, 0x1c, 0xf4, 0x84, 0x9e, 0x84, 0x73,
+ 0xd7, 0xb7, 0xae, 0x74, 0xff, 0xef, 0x34, 0xec,
+ 0x7d, 0xdb, 0x99, 0xdd, 0xf3, 0xa6, 0xed, 0x43,
+ 0xa5, 0xaa, 0xe2, 0x21, 0xec, 0x45, 0xc9, 0xb3,
+ 0xeb, 0x75, 0xf9, 0xc7, 0x4f, 0x7a, 0x9e, 0x01,
+ 0xd3, 0x82, 0x10, 0x95, 0x3e, 0xef, 0xde, 0xd8,
+ 0x55, 0x4b, 0xc9, 0xf7, 0x5d, 0xac, 0xb9, 0xd1,
+ 0xb2, 0x26, 0x80, 0x7d, 0xf3, 0x59, 0xff, 0x81,
+ 0xe6, 0xb7, 0x59, 0x3c, 0x3a, 0x6a, 0xce, 0x9f,
+ 0xf7, 0xb5, 0xa7, 0xd2, 0x89, 0xe6, 0x1d, 0x3f,
+ 0x63, 0x6d, 0x1d, 0x94, 0x3a, 0x7b, 0x36, 0xc7,
+ 0x8e, 0x8c, 0x4f, 0x37, 0xd0, 0xc0, 0x68, 0xc6,
+ 0xc9, 0x9f, 0x3f, 0xb9, 0x7c, 0xfd, 0x81, 0x4c,
+ 0xdb, 0xc7, 0x4f, 0xff, 0xfe, 0xff, 0xdf, 0x4d,
+ 0x7f, 0xcd, 0xad, 0xe6, 0xb7, 0x53, 0x1f, 0x70,
+ 0xe0, 0x4e, 0x9f, 0x7a, 0xfa, 0x23, 0xc7, 0x4f,
+ 0xe7, 0xdd, 0x4d, 0x7a, 0x23, 0xe7, 0x4f, 0xee,
+ 0x0e, 0x8d, 0x25, 0xf8, 0xe8, 0xf1, 0xf5, 0xfc,
+ 0xe2, 0x11, 0x33, 0x5c, 0x7f, 0x18, 0x4a, 0x4d,
+ 0xa3, 0x8e, 0x9d, 0xd7, 0xa1, 0xd3, 0x68, 0xf1,
+ 0xd3, 0xc9, 0xfb, 0xb4, 0xe3, 0x66, 0x23, 0x73,
+ 0xff, 0xed, 0x12, 0xfb, 0xbf, 0xa6, 0xa6, 0xec,
+ 0xbb, 0x7e, 0x5c, 0xe9, 0xff, 0xac, 0x9a, 0xf7,
+ 0x5f, 0xfd, 0x74, 0xb9, 0xd3, 0xfb, 0x73, 0xee,
+ 0xf5, 0xb4, 0x61, 0xd0, 0x03, 0xff, 0xfa, 0x3c,
+ 0xff, 0x85, 0xad, 0xd4, 0x4f, 0x3d, 0xd7, 0x3a,
+ 0x10, 0xf8, 0xf4, 0x22, 0x9f, 0xff, 0xfe, 0xd3,
+ 0xf4, 0x1f, 0xa3, 0x5b, 0xb7, 0xdf, 0xce, 0xc7,
+ 0xef, 0x8d, 0xbf, 0x94, 0x3a, 0x48, 0x74, 0xfe,
+ 0x77, 0x0f, 0xa8, 0x8f, 0x9d, 0x3f, 0xff, 0xff,
+ 0xbc, 0x0a, 0x7f, 0x39, 0xfd, 0xdb, 0x5b, 0x4d,
+ 0xdf, 0xc7, 0xdd, 0x9a, 0x3d, 0xfc, 0xe7, 0xce,
+ 0x9d, 0xdc, 0xa6, 0x8a, 0x62, 0x31, 0x17, 0xeb,
+ 0x09, 0x99, 0xff, 0x67, 0xdf, 0x75, 0x2e, 0x82,
+ 0xd1, 0xd3, 0xe7, 0xff, 0x8d, 0xb0, 0xe8, 0xf1,
+ 0xf4, 0x71, 0xfc, 0xff, 0x73, 0x36, 0xb2, 0x3d,
+ 0x81, 0x3a, 0x7f, 0xff, 0x7f, 0x16, 0xf7, 0x4b,
+ 0xd1, 0xaf, 0xe0, 0x77, 0x23, 0x75, 0x3a, 0x7f,
+ 0xca, 0x8c, 0xb6, 0x53, 0x3d, 0xf3, 0xa1, 0x11,
+ 0x49, 0x66, 0x89, 0xf0, 0xa3, 0x64, 0x13, 0xa7,
+ 0xee, 0xfe, 0xed, 0x93, 0xe7, 0x46, 0x1f, 0xbf,
+ 0x88, 0xb4, 0x26, 0x87, 0x97, 0x67, 0xf6, 0x4a,
+ 0xd6, 0x70, 0xb1, 0xa1, 0xbe, 0x45, 0xe8, 0x43,
+ 0x34, 0x1e, 0x30, 0xf1, 0x64, 0x23, 0xbe, 0x43,
+ 0x78, 0xd5, 0x27, 0xfd, 0xac, 0x78, 0x3b, 0xbb,
+ 0x6e, 0x78, 0xe9, 0xec, 0xfe, 0xbd, 0x59, 0xd3,
+ 0xff, 0xff, 0xeb, 0x7a, 0xf6, 0xc1, 0x46, 0xdb,
+ 0x99, 0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7, 0xc1,
+ 0x43, 0xa5, 0x7f, 0x22, 0xda, 0x84, 0xf3, 0xff,
+ 0xec, 0xcb, 0x79, 0x6d, 0x9b, 0xa9, 0xa5, 0x93,
+ 0x56, 0x74, 0xff, 0xd4, 0xe7, 0xf7, 0x31, 0x33,
+ 0xf7, 0x6f, 0x3a, 0x5e, 0xfa, 0x28, 0xee, 0xb5,
+ 0x3e, 0x72, 0x3e, 0xea, 0x1d, 0x3f, 0xff, 0xff,
+ 0xec, 0xfe, 0xbd, 0xde, 0xb6, 0x95, 0x6b, 0xd7,
+ 0x46, 0x7f, 0xb5, 0xdb, 0xd5, 0xcb, 0x3e, 0x04,
+ 0xd8, 0xa9, 0xff, 0xff, 0x97, 0xc1, 0xdb, 0x41,
+ 0xdd, 0xa2, 0x3d, 0x45, 0xb6, 0x96, 0x7f, 0x82,
+ 0x74, 0xda, 0x3c, 0xfa, 0x68, 0xde, 0x28, 0xa4,
+ 0x29, 0x61, 0x15, 0x40, 0x5a, 0x19, 0x9f, 0x8d,
+ 0xbe, 0x7f, 0xf3, 0x17, 0x75, 0xb9, 0xd8, 0xce,
+ 0xf8, 0x0e, 0x9f, 0xff, 0x7b, 0xf7, 0xb6, 0x6a,
+ 0x5d, 0xac, 0xd5, 0xf7, 0xc0, 0x74, 0xff, 0xc9,
+ 0xf7, 0xbf, 0x8d, 0xa9, 0xa2, 0x3e, 0x74, 0x51,
+ 0x14, 0xba, 0x2e, 0xcf, 0x65, 0xf1, 0xbb, 0x3a,
+ 0x73, 0x7e, 0x58, 0xe9, 0xb3, 0x63, 0xa1, 0xe4,
+ 0xdb, 0x1d, 0x0e, 0xfa, 0x12, 0x5c, 0x95, 0xb0,
+ 0xf4, 0xfd, 0xb2, 0x7e, 0xdc, 0xe3, 0xa7, 0x26,
+ 0xc8, 0x74, 0xfe, 0x69, 0xd9, 0x7a, 0x73, 0x5b,
+ 0x8f, 0x21, 0x85, 0xb3, 0xf6, 0xa5, 0xbb, 0x56,
+ 0x80, 0x3a, 0x7f, 0x0b, 0x5f, 0xcb, 0x75, 0xce,
+ 0x8c, 0x3e, 0x5f, 0x19, 0xcf, 0xc8, 0x0c, 0xbe,
+ 0xf7, 0x8e, 0x87, 0x1e, 0x87, 0xc8, 0x67, 0xff,
+ 0xfd, 0x7f, 0xf0, 0x28, 0xf6, 0x7b, 0xf7, 0xfe,
+ 0x36, 0xdd, 0x40, 0xfc, 0xe9, 0xff, 0x7b, 0x1a,
+ 0xdd, 0x44, 0xb7, 0x6a, 0xce, 0x9f, 0xdc, 0xfd,
+ 0x2d, 0x9c, 0x27, 0x46, 0xc7, 0xeb, 0x74, 0x49,
+ 0x30, 0xe9, 0xdf, 0xcd, 0x8e, 0x84, 0x35, 0x8f,
+ 0x88, 0x4f, 0xcf, 0xd3, 0x33, 0xfa, 0xce, 0x9e,
+ 0x66, 0xf4, 0x01, 0xd1, 0x87, 0xa5, 0xe2, 0xf8,
+ 0x44, 0xf2, 0xb2, 0x1c, 0xfe, 0x4f, 0x17, 0x39,
+ 0xfd, 0x7f, 0x3d, 0x96, 0xd2, 0xe7, 0x4f, 0x63,
+ 0xe8, 0xd1, 0xd3, 0xf5, 0xb9, 0xcc, 0x1f, 0x1d,
+ 0x3e, 0xf0, 0x07, 0x1f, 0x3a, 0x35, 0xa2, 0xab,
+ 0xc6, 0xa0, 0x22, 0xd0, 0xb2, 0x7f, 0xfe, 0x17,
+ 0x5b, 0x1a, 0xb2, 0x7f, 0x5f, 0xf2, 0xf6, 0xd0,
+ 0xe9, 0xff, 0xfd, 0xec, 0x7d, 0xd4, 0xbd, 0x91,
+ 0x89, 0xed, 0xb7, 0x23, 0x75, 0x3a, 0x7f, 0xff,
+ 0xfd, 0xa7, 0xf7, 0x07, 0x9f, 0x70, 0xf0, 0x37,
+ 0x53, 0x44, 0x7e, 0xd9, 0xef, 0xe6, 0xb3, 0xa7,
+ 0xff, 0xda, 0x08, 0xe5, 0xe9, 0x6f, 0x66, 0xeb,
+ 0x01, 0x0e, 0x8c, 0x47, 0x15, 0xa1, 0x19, 0x3f,
+ 0xfc, 0xed, 0x4b, 0x62, 0x7d, 0xaf, 0xe5, 0xe9,
+ 0xc7, 0x4f, 0xff, 0xb6, 0xc6, 0x6e, 0xd4, 0xba,
+ 0x51, 0xa7, 0x70, 0xbc, 0x74, 0xff, 0x67, 0xde,
+ 0xdc, 0x0e, 0xe6, 0x8e, 0x9f, 0xf5, 0x34, 0xfe,
+ 0xea, 0x68, 0xdf, 0xa0, 0x9d, 0x3f, 0xf9, 0xed,
+ 0xd4, 0xb6, 0x9b, 0xaf, 0x4a, 0x20, 0x9d, 0x3f,
+ 0xff, 0xec, 0x7e, 0x9e, 0xc0, 0xee, 0xb6, 0x5e,
+ 0x98, 0xf6, 0xec, 0xf6, 0xc7, 0x46, 0x23, 0x0b,
+ 0xca, 0x10, 0xf2, 0xb8, 0x75, 0x8d, 0x31, 0xf2,
+ 0x7f, 0x29, 0x31, 0x72, 0x87, 0x77, 0x8c, 0x26,
+ 0x7f, 0xdc, 0x36, 0xcb, 0xa7, 0xfc, 0x03, 0xa7,
+ 0xfb, 0x02, 0xfb, 0xa9, 0xba, 0xfe, 0x3a, 0x7f,
+ 0xff, 0xc8, 0xa8, 0xcd, 0xcd, 0x5b, 0xdf, 0xdb,
+ 0x76, 0xf5, 0xfe, 0x5b, 0x0e, 0x85, 0x47, 0x57,
+ 0xcf, 0x35, 0x0f, 0x27, 0xbd, 0x7f, 0x21, 0xd3,
+ 0xff, 0xff, 0xf5, 0xd1, 0x9f, 0xf6, 0xbb, 0x73,
+ 0x5b, 0xbf, 0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7,
+ 0xc1, 0x43, 0xa1, 0xc8, 0xb8, 0xf1, 0x0c, 0x22,
+ 0xf2, 0x7e, 0x4b, 0xe5, 0xf4, 0x6b, 0xbd, 0x0e,
+ 0xa9, 0xeb, 0xd3, 0x80, 0x74, 0xff, 0xd6, 0xf6,
+ 0xef, 0x0e, 0x8f, 0x70, 0xa9, 0xd3, 0xf5, 0xf8,
+ 0x7e, 0xff, 0x8e, 0x8c, 0x44, 0xa6, 0xb2, 0x1b,
+ 0xa3, 0x4f, 0x6f, 0xd3, 0xa8, 0x74, 0xff, 0xfd,
+ 0xe1, 0xdd, 0x9e, 0xcf, 0xeb, 0xb7, 0xb1, 0x98,
+ 0xa7, 0x4f, 0xff, 0xf7, 0x9e, 0x14, 0x65, 0x34,
+ 0x4d, 0xc8, 0x29, 0xb5, 0x91, 0x87, 0x46, 0x23,
+ 0x10, 0x57, 0x27, 0xff, 0xff, 0x08, 0xf9, 0xed,
+ 0xd6, 0xcb, 0xfd, 0x1a, 0xb6, 0x3c, 0x8f, 0xdf,
+ 0x45, 0x3a, 0x7f, 0xff, 0xe4, 0xd7, 0x64, 0xdd,
+ 0xfc, 0xd3, 0x5e, 0xe7, 0xdd, 0x4f, 0x7f, 0x7a,
+ 0x3c, 0x74, 0xf9, 0xfa, 0x7b, 0x3e, 0x74, 0x62,
+ 0x29, 0xf4, 0x7f, 0x8f, 0x26, 0x8d, 0x68, 0xc8,
+ 0xe7, 0xfb, 0xfa, 0x35, 0xfc, 0xb7, 0x5c, 0xe9,
+ 0xfe, 0xda, 0xc8, 0x1d, 0xad, 0xcc, 0x3a, 0x7f,
+ 0xff, 0xb8, 0x6d, 0x97, 0xf6, 0x7d, 0xea, 0x26,
+ 0x7f, 0x6b, 0x21, 0xd3, 0xd7, 0xdc, 0xf0, 0x9d,
+ 0x0f, 0xa2, 0x27, 0x99, 0x67, 0xe6, 0x9f, 0x76,
+ 0x89, 0x73, 0xa7, 0xfa, 0xdc, 0xcf, 0xe5, 0xba,
+ 0xe7, 0x42, 0x1f, 0x3d, 0x0c, 0x27, 0xec, 0xb8,
+ 0x8e, 0x38, 0xe9, 0xfb, 0xf9, 0x6f, 0xe2, 0x9d,
+ 0x3d, 0xfc, 0xa6, 0xe6, 0x8f, 0x56, 0xe5, 0x51,
+ 0xb2, 0xbc, 0xa5, 0x8d, 0x9f, 0xc5, 0x42, 0x75,
+ 0x68, 0x61, 0xde, 0x11, 0x4d, 0x9d, 0xa7, 0xfe,
+ 0xff, 0xf3, 0x70, 0xe5, 0xbf, 0x8d, 0x1d, 0x08,
+ 0xba, 0xdd, 0x93, 0x96, 0x5c, 0xef, 0x3e, 0xfa,
+ 0x33, 0xb6, 0x3a, 0x7f, 0x63, 0x56, 0xcb, 0xa6,
+ 0xc7, 0x4f, 0xff, 0xff, 0x5b, 0x2f, 0x4e, 0x6b,
+ 0x77, 0xf1, 0xf7, 0x66, 0x8f, 0x7f, 0x36, 0xb7,
+ 0x9a, 0x3a, 0x6d, 0x35, 0x9d, 0x02, 0x89, 0xeb,
+ 0xc2, 0x16, 0x7e, 0xc7, 0xbf, 0x8f, 0xd0, 0xe9,
+ 0xff, 0xc2, 0xfb, 0xa9, 0x8c, 0x7d, 0x2d, 0x64,
+ 0x3a, 0x54, 0x3a, 0x34, 0x3d, 0xad, 0xe9, 0x53,
+ 0xf9, 0x19, 0xfc, 0xb7, 0x5c, 0xe9, 0xff, 0xff,
+ 0x5f, 0xe8, 0x07, 0xdd, 0x4d, 0x12, 0xff, 0xcd,
+ 0xbd, 0x82, 0xd1, 0xd1, 0xe5, 0x4d, 0x8d, 0x13,
+ 0xf4, 0x34, 0x7e, 0x4f, 0x48, 0x44, 0x68, 0x4b,
+ 0xbc, 0xc6, 0x7c, 0xef, 0x0e, 0x3e, 0x74, 0xfb,
+ 0x28, 0xf6, 0x04, 0xe8, 0x7c, 0xf3, 0xac, 0x4f,
+ 0x3f, 0xfe, 0xf3, 0xd8, 0xbb, 0x5b, 0xd9, 0xaf,
+ 0x76, 0xbd, 0x10, 0xe9, 0xed, 0x4b, 0xe5, 0x8e,
+ 0x9f, 0xff, 0xfb, 0x51, 0xf7, 0x73, 0xfb, 0xbf,
+ 0xa6, 0xa6, 0xec, 0x7d, 0xd9, 0xa7, 0xc1, 0x43,
+ 0xa1, 0xe4, 0x53, 0x61, 0x24, 0xff, 0xff, 0xf9,
+ 0x1f, 0xa6, 0x88, 0xfe, 0xeb, 0x66, 0xdb, 0xbf,
+ 0x9a, 0x6b, 0xdd, 0x40, 0x03, 0xd7, 0x3a, 0x7c,
+ 0x9f, 0x7f, 0x9e, 0x3a, 0x7f, 0xff, 0xff, 0xf6,
+ 0x33, 0x15, 0x2c, 0x8c, 0xbe, 0x52, 0x88, 0x22,
+ 0x9f, 0xc7, 0xb3, 0x4a, 0x68, 0xd7, 0xd1, 0x87,
+ 0x4f, 0xf0, 0x33, 0x6f, 0xe5, 0xba, 0xe7, 0x4f,
+ 0xfc, 0xfa, 0x6b, 0xd4, 0xd3, 0x3e, 0xd6, 0xf6,
+ 0x1d, 0x3f, 0xfd, 0x97, 0xdb, 0x30, 0x14, 0xdc,
+ 0x34, 0xda, 0x87, 0x42, 0x2b, 0x7d, 0xc2, 0x3f,
+ 0x46, 0x06, 0x24, 0x6c, 0x84, 0x8d, 0x8a, 0x3a,
+ 0x14, 0x7f, 0x38, 0xa2, 0x74, 0xed, 0xb7, 0x34,
+ 0x74, 0xff, 0xf3, 0xee, 0xfa, 0x6e, 0x67, 0xd3,
+ 0x5d, 0xfc, 0xf1, 0xd1, 0x87, 0xed, 0xe2, 0x09,
+ 0xf9, 0xe6, 0x9c, 0xdc, 0x17, 0x8e, 0x9f, 0x33,
+ 0xdb, 0x66, 0xc7, 0x49, 0xa3, 0xa6, 0x46, 0x1d,
+ 0x2b, 0x9d, 0x02, 0x69, 0x78, 0x56, 0x36, 0x3d,
+ 0x5b, 0x1b, 0x4f, 0x5e, 0x9c, 0xf9, 0xd3, 0x35,
+ 0xc7, 0x4f, 0xeb, 0x78, 0x5f, 0x77, 0xd0, 0xe8,
+ 0xd5, 0x09, 0xa0, 0x21, 0xa6, 0x3f, 0x78, 0x8d,
+ 0x84, 0x5a, 0x0b, 0x4f, 0xea, 0x79, 0xf0, 0xf7,
+ 0xc0, 0x74, 0xff, 0xf9, 0x05, 0x17, 0x18, 0x8a,
+ 0xef, 0x53, 0x46, 0x1d, 0x0d, 0x22, 0x19, 0xbc,
+ 0xd2, 0x77, 0xc0, 0x87, 0x4a, 0xad, 0xc7, 0x56,
+ 0xbe, 0x92, 0x81, 0x9e, 0x5d, 0xda, 0x36, 0x1c,
+ 0x9d, 0xd2, 0xd7, 0x0b, 0xa5, 0x96, 0xf0, 0xfc,
+ 0x75, 0x1e, 0x84, 0xdb, 0x51, 0x81, 0x8c, 0x7d,
+ 0x8c, 0x87, 0x55, 0xa7, 0xa3, 0xfa, 0x1c, 0x7f,
+ 0x9d, 0x9f, 0xa4, 0xaa, 0x4b, 0xce, 0x1f, 0x36,
+ 0x8c, 0x09, 0xbe, 0x36, 0x1d, 0xf0, 0xe3, 0xd4,
+ 0x27, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x53,
+ 0xb3, 0xe1, 0x5e, 0xe5, 0x34, 0x54, 0x73, 0xfe,
+ 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x34, 0x4a,
+ 0xb8, 0x7e, 0xcc, 0x30, 0x9f, 0xd5, 0xc1, 0x5e,
+ 0xe5, 0x34, 0x55, 0xf3, 0xe1, 0x5e, 0xe5, 0x34,
+ 0x56, 0xd3, 0xfc, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
+ 0x24, 0x19, 0x57, 0x0f, 0xc7, 0x8c, 0x27, 0xfe,
+ 0xaf, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x0e,
+ 0x7c, 0x2b, 0xdc, 0xa6, 0x8b, 0x12, 0x7f, 0xe4,
+ 0xca, 0x67, 0xf6, 0xf0, 0x13, 0xe7, 0x4e, 0xfa,
+ 0x3c, 0x74, 0x9d, 0xf3, 0xdf, 0xd1, 0x0e, 0x73,
+ 0x7f, 0x80, 0x74, 0xe1, 0x47, 0x1d, 0x3e, 0xe7,
+ 0x6f, 0xb2, 0x1d, 0x3f, 0x52, 0x83, 0xe0, 0xea,
+ 0xce, 0x8f, 0x1e, 0xcf, 0x14, 0x4f, 0xe0, 0x26,
+ 0x5f, 0xdf, 0x09, 0x51, 0x89, 0xce, 0xbf, 0x08,
+ 0xff, 0x14, 0x88, 0xfd, 0x9c, 0xc0, 0x43, 0x3f,
+ 0xf5, 0xbc, 0x97, 0xb7, 0x6b, 0xcf, 0x80, 0xe9,
+ 0xff, 0xfd, 0x7b, 0xf3, 0xa9, 0x9f, 0x46, 0x76,
+ 0x5e, 0xe8, 0xc3, 0xa7, 0xff, 0xb1, 0xf7, 0x5f,
+ 0x47, 0xab, 0x6e, 0x67, 0xa8, 0x74, 0xd6, 0xae,
+ 0x23, 0xdb, 0xc8, 0xbf, 0x5e, 0x8a, 0xa7, 0x1a,
+ 0x91, 0xa9, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
+ 0x2c, 0xd9, 0xff, 0xd5, 0x67, 0x3a, 0xb8, 0x2b,
+ 0xdc, 0xa6, 0x8a, 0x02, 0x6d, 0xd4, 0x3a, 0x79,
+ 0x7b, 0x94, 0xd1, 0x6f, 0xcf, 0xdb, 0xef, 0xcb,
+ 0xc2, 0x74, 0x09, 0xeb, 0x80, 0xae, 0x7d, 0x77,
+ 0x53, 0x7d, 0x0e, 0x9f, 0xc8, 0xdb, 0x7d, 0xfe,
+ 0x80, 0x3a, 0x7f, 0x68, 0xfd, 0x11, 0x71, 0x87,
+ 0x4e, 0xfe, 0x38, 0xe9, 0x55, 0xc9, 0x9f, 0x63,
+ 0x78, 0x90, 0xd8, 0xab, 0xe6, 0xd7, 0x33, 0x9f,
+ 0xf7, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x8a, 0x52,
+ 0x7f, 0x9d, 0x5c, 0x15, 0xee, 0x53, 0x44, 0x9d,
+ 0x2a, 0xb1, 0x10, 0xfc, 0x8d, 0x08, 0xed, 0xc2,
+ 0x5e, 0x8c, 0x8b, 0x6b, 0x58, 0x43, 0x91, 0xd3,
+ 0xac, 0x2c, 0x7c, 0x4f, 0xab, 0x85, 0x63, 0x44,
+ 0xcc, 0x96, 0xed, 0x62, 0x90, 0x1d, 0xd2, 0x39,
+ 0x06, 0xd0, 0xe3, 0x9f, 0x0a, 0xf7, 0x29, 0xa2,
+ 0x1f, 0x9f, 0xf7, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6,
+ 0x89, 0x4e, 0x55, 0xc3, 0xf6, 0x61, 0x84, 0xfe,
+ 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x27, 0x9f, 0xd5,
+ 0xc1, 0x5e, 0xe5, 0x34, 0x46, 0x33, 0xff, 0xaa,
+ 0xce, 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x13, 0xcc,
+ 0x22, 0x3b, 0xde, 0x27, 0x71, 0xdd, 0x8e, 0xe7,
+ 0xc2, 0xbd, 0xca, 0x68, 0x88, 0x27, 0xfd, 0xce,
+ 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x54, 0x95, 0x70,
+ 0xfd, 0x98, 0x61, 0x3f, 0xab, 0x82, 0xbd, 0xca,
+ 0x68, 0x8a, 0x27, 0xf5, 0x70, 0x57, 0xb9, 0x4d,
+ 0x11, 0x94, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
+ 0xee, 0x53, 0x44, 0xcb, 0x3f, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0xa9, 0x27, 0xf5, 0x70, 0x57, 0xb9,
+ 0x4d, 0x15, 0xd4, 0xfe, 0xae, 0x0a, 0xf7, 0x29,
+ 0xa2, 0xc5, 0x9f, 0xf9, 0x9c, 0xea, 0xe0, 0xaf,
+ 0x72, 0x9a, 0x27, 0xa9, 0xfe, 0x0d, 0x79, 0x3c,
+ 0xdf, 0xed, 0x43, 0xa2, 0xa8, 0x8a, 0x44, 0xc9,
+ 0xfb, 0x54, 0xf9, 0x7f, 0x69, 0x43, 0xa7, 0x85,
+ 0x97, 0x7c, 0xe9, 0xcb, 0x96, 0x2a, 0x7f, 0xfe,
+ 0xb7, 0xfb, 0x5f, 0x85, 0x1c, 0xec, 0xa0, 0x00,
+ 0x87, 0x4f, 0xff, 0xc3, 0xed, 0x4e, 0x65, 0x50,
+ 0x47, 0xda, 0x8b, 0xa3, 0xc7, 0x4f, 0x97, 0xd6,
+ 0xde, 0xc3, 0xa7, 0xff, 0x75, 0x3f, 0x80, 0xad,
+ 0xbc, 0xbc, 0x27, 0x4f, 0xaf, 0x64, 0x62, 0x9d,
+ 0x3f, 0xfb, 0xfb, 0x91, 0x3e, 0x8c, 0xdd, 0xba,
+ 0xcd, 0xe7, 0x4f, 0xf6, 0x9d, 0x4e, 0xb6, 0x9f,
+ 0x78, 0xe8, 0xf2, 0x7b, 0xc2, 0xb6, 0xc6, 0x0b,
+ 0x14, 0xfd, 0x1e, 0xe4, 0xda, 0x8a, 0x53, 0xbf,
+ 0xd7, 0x35, 0x42, 0xd3, 0xbf, 0xea, 0x1d, 0x20,
+ 0xea, 0xa7, 0x88, 0x85, 0x13, 0xc2, 0xdb, 0x98,
+ 0x74, 0x61, 0xe7, 0x78, 0xb2, 0x7f, 0xde, 0xb7,
+ 0x5d, 0x1a, 0xa7, 0x98, 0x74, 0xfd, 0xef, 0xeb,
+ 0xf6, 0x50, 0xe9, 0xef, 0xed, 0xbb, 0x59, 0xd3,
+ 0xf6, 0x50, 0x3d, 0xf7, 0x8e, 0x8e, 0x3d, 0x4f,
+ 0x93, 0xcf, 0xb4, 0xd7, 0x4d, 0x90, 0xe8, 0xc4,
+ 0x67, 0xfa, 0x10, 0x76, 0x21, 0x9f, 0xff, 0xfd,
+ 0x64, 0xf0, 0x8a, 0x6f, 0xbf, 0xbf, 0xa3, 0xb2,
+ 0x9b, 0x69, 0xc2, 0xe3, 0xa7, 0xcf, 0x6c, 0x3e,
+ 0x09, 0xd3, 0xf6, 0xdc, 0x20, 0x6f, 0xc3, 0xa7,
+ 0xfd, 0xff, 0x3a, 0xf6, 0xc1, 0xf5, 0x0e, 0x9f,
+ 0xf7, 0x60, 0x13, 0xfd, 0xb6, 0x6b, 0x3a, 0x1c,
+ 0x7f, 0x80, 0x3e, 0x9e, 0xd2, 0x96, 0x61, 0xd3,
+ 0xf6, 0x94, 0xbd, 0x32, 0xe7, 0x4e, 0x08, 0x42,
+ 0x54, 0xff, 0xeb, 0xfa, 0xf4, 0xb7, 0x9b, 0xf7,
+ 0x8a, 0x38, 0xaa, 0x97, 0x91, 0xe4, 0x54, 0x68,
+ 0x95, 0x0e, 0x54, 0xbf, 0x8f, 0x5e, 0x29, 0x18,
+ 0x55, 0xfc, 0x8a, 0xf0, 0xcb, 0x9b, 0x5e, 0x1d,
+ 0x3e, 0x0d, 0xd1, 0xf0, 0x9d, 0x3f, 0x93, 0x86,
+ 0xc1, 0xed, 0x8a, 0x98, 0x21, 0x2a, 0x36, 0x3c,
+ 0x70, 0x98, 0xcf, 0x52, 0xfe, 0xd5, 0x95, 0x53,
+ 0x47, 0x3f, 0xfb, 0x4a, 0x53, 0x6f, 0xa6, 0xd6,
+ 0x4b, 0xd0, 0xe9, 0xff, 0x5f, 0xc3, 0xc0, 0xd4,
+ 0xbe, 0x58, 0xe8, 0x72, 0x23, 0x7c, 0x9b, 0x3e,
+ 0xc7, 0xb3, 0xc2, 0x74, 0xfd, 0x74, 0x1d, 0xb3,
+ 0xe7, 0x4f, 0xed, 0xac, 0x9f, 0x0f, 0x3e, 0x74,
+ 0xff, 0xff, 0xbc, 0xce, 0xfb, 0xee, 0xa8, 0x73,
+ 0xcd, 0xb3, 0xf9, 0xb7, 0x38, 0xf1, 0x7a, 0xc2,
+ 0x23, 0x73, 0x8b, 0x34, 0x34, 0x9f, 0xfe, 0xcb,
+ 0xd3, 0x1a, 0xb2, 0x36, 0xcb, 0x59, 0x0e, 0x9f,
+ 0xff, 0xff, 0x7b, 0x1f, 0xa7, 0xb0, 0x3b, 0xb1,
+ 0xf7, 0x53, 0xd7, 0xa7, 0x9f, 0xdb, 0x6d, 0x1e,
+ 0x3a, 0x3e, 0x8d, 0xeb, 0xa8, 0x4d, 0xe0, 0x9d,
+ 0x36, 0xf0, 0x1d, 0x0d, 0x1a, 0xe0, 0x0b, 0x4e,
+ 0x77, 0x6c, 0x74, 0xc1, 0x09, 0xd1, 0xe3, 0xd4,
+ 0xa1, 0x10, 0x47, 0x27, 0x5f, 0x78, 0x0a, 0xa9,
+ 0xaf, 0x9f, 0xff, 0xfd, 0x74, 0xda, 0xda, 0x76,
+ 0xb6, 0x76, 0xd9, 0x9f, 0xd7, 0x4a, 0x67, 0xc0,
+ 0x74, 0x3e, 0x8a, 0xbf, 0x17, 0x4f, 0xf6, 0x5e,
+ 0xc8, 0x37, 0xc5, 0x3a, 0x72, 0x0b, 0x47, 0x46,
+ 0x27, 0xe7, 0xd1, 0xbf, 0xfc, 0x91, 0xbc, 0xd6,
+ 0x7d, 0xfc, 0xbf, 0x6a, 0x1d, 0x3f, 0xf6, 0x08,
+ 0xe3, 0x56, 0xca, 0x77, 0xce, 0x9f, 0xdf, 0x41,
+ 0xd1, 0x6c, 0x87, 0x4f, 0xbd, 0xae, 0xdc, 0xe3,
+ 0xa7, 0xef, 0x23, 0x1e, 0xc0, 0x9d, 0x30, 0x42,
+ 0x74, 0x29, 0xf6, 0x09, 0x48, 0x4b, 0x67, 0xfb,
+ 0x1a, 0xe6, 0xb9, 0xf7, 0x50, 0xaa, 0x9a, 0xd9,
+ 0xff, 0xd9, 0xf0, 0x65, 0xbc, 0xfd, 0x2d, 0xa5,
+ 0x0e, 0x9f, 0xbf, 0xc0, 0xdb, 0x3e, 0x74, 0xfc,
+ 0xcf, 0x37, 0xe0, 0xeb, 0x3a, 0x70, 0x42, 0x12,
+ 0xa7, 0xfe, 0x41, 0xfe, 0x9d, 0xbf, 0x1a, 0x46,
+ 0x1d, 0x52, 0xf2, 0x35, 0x6a, 0x8b, 0x9a, 0x86,
+ 0x55, 0x12, 0xae, 0x99, 0xa1, 0x68, 0x53, 0x67,
+ 0x70, 0xbc, 0x79, 0x04, 0xa7, 0x9d, 0x8f, 0xb8,
+ 0xf2, 0x09, 0x4e, 0xa7, 0xb6, 0x3c, 0x82, 0x53,
+ 0x04, 0x27, 0x90, 0x4a, 0x15, 0x14, 0x8d, 0x14,
+ 0x5c, 0xbc, 0x25, 0x53, 0x75, 0xcb, 0x20, 0x95,
+ 0x4d, 0xec, 0xfd, 0x96, 0xcc, 0xfe, 0xb3, 0xa7,
+ 0x77, 0xc1, 0xf3, 0xdf, 0xb9, 0x94, 0xf3, 0x7e,
+ 0x75, 0x8e, 0x96, 0x6a, 0xcf, 0x58, 0x06, 0x73,
+ 0xf9, 0xa7, 0x68, 0xf5, 0xfc, 0xf1, 0x53, 0xfb,
+ 0xce, 0xd3, 0xa9, 0x6f, 0x1d, 0x27, 0x15, 0x3b,
+ 0x85, 0xe2, 0xa0, 0xa8, 0x43, 0x6a, 0xa2, 0x0c,
+ 0x1b, 0x9e, 0xfa, 0x01, 0x4a, 0xa9, 0xac, 0x84,
+ 0x46, 0x2e, 0x42, 0x56, 0x7b, 0x4e, 0x17, 0x1d,
+ 0x26, 0x1d, 0x36, 0x3b, 0x63, 0x62, 0xd1, 0x0c,
+ 0xf8, 0x38, 0xd7, 0x98, 0x74, 0xfc, 0xa8, 0xd3,
+ 0x90, 0x05, 0x4b, 0xc7, 0x4f, 0xf3, 0xda, 0x3b,
+ 0x6b, 0x69, 0xdf, 0x3a, 0x7e, 0xf2, 0x31, 0xec,
+ 0x09, 0xd3, 0xec, 0x79, 0x98, 0xc3, 0xa7, 0x53,
+ 0xc2, 0x74, 0x7c, 0xf0, 0xae, 0x4f, 0x3f, 0x7f,
+ 0x80, 0x0d, 0x28, 0x74, 0xfd, 0xed, 0x7b, 0xd1,
+ 0x95, 0xd9, 0x30, 0xcc, 0x10, 0x13, 0xda, 0x37,
+ 0xdc, 0x8a, 0x31, 0x3d, 0x1f, 0x14, 0x7e, 0x33,
+ 0x89, 0xef, 0xe3, 0xda, 0x1d, 0x0e, 0x57, 0xaf,
+ 0x85, 0x76, 0x87, 0xef, 0xd5, 0xe9, 0x1f, 0xfd,
+ 0xcd, 0xa7, 0x04, 0x21, 0x2a, 0x70, 0xb9, 0x0a,
+ 0xa9, 0x79, 0x3f, 0x3c, 0xd3, 0x9b, 0x82, 0xf1,
+ 0xd3, 0xd6, 0xe7, 0xc2, 0x74, 0xf9, 0xe1, 0xf2,
+ 0x30, 0xe9, 0xff, 0xe4, 0xdf, 0x7f, 0xa0, 0x3a,
+ 0xe0, 0xdf, 0xf7, 0x1d, 0x1a, 0xa1, 0x1a, 0x1e,
+ 0x34, 0xe2, 0x2b, 0x93, 0xce, 0x77, 0xbe, 0x74,
+ 0xfd, 0x74, 0x6b, 0xfa, 0x50, 0xe8, 0x71, 0xe5,
+ 0xdc, 0x72, 0x76, 0x9a, 0x37, 0x67, 0x4d, 0xd5,
+ 0x6e, 0x8d, 0xbf, 0xae, 0xa9, 0x1b, 0x6a, 0x98,
+ 0x44, 0x91, 0xfc, 0x3d, 0x0f, 0x97, 0x10, 0xed,
+ 0x18, 0x76, 0x4a, 0x93, 0xd6, 0xc2, 0xa2, 0xfe,
+ 0x84, 0x93, 0x50, 0xc3, 0x12, 0x36, 0x46, 0x05,
+ 0x69, 0x60, 0x1c, 0x8b, 0xf2, 0x9a, 0x4a, 0x6f,
+ 0xbc, 0xee, 0x8e, 0x8f, 0xed, 0xf0, 0xf9, 0xdf,
+ 0x08, 0xdd, 0x42, 0x29, 0xff, 0xd5, 0x67, 0x3a,
+ 0xb8, 0x2b, 0xdc, 0xa6, 0x8a, 0x2a, 0x7f, 0x57,
+ 0x05, 0x7b, 0x94, 0xd1, 0x74, 0x4f, 0xfd, 0x5e,
+ 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x5c, 0xfe,
+ 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0xf2, 0x84, 0x6f,
+ 0x40, 0x1e, 0x27, 0x71, 0xde, 0x1d, 0xaa, 0x93,
+ 0x47, 0x6c, 0x3b, 0xb4, 0x31, 0x7f, 0x5c, 0x0b,
+ 0xd2, 0x3a, 0xbb, 0xa9, 0x68, 0x76, 0xd9, 0x32,
+ 0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29,
+ 0xa2, 0x59, 0x9e, 0x5e, 0xe5, 0x34, 0x46, 0x73,
+ 0xf7, 0x91, 0x8f, 0x60, 0x4e, 0x9b, 0xee, 0x3a,
+ 0x4c, 0x3a, 0x7d, 0xe1, 0xb7, 0x54, 0x4f, 0x4d,
+ 0x85, 0xbb, 0xc5, 0xa7, 0xee, 0x77, 0x87, 0x84,
+ 0xe9, 0xd4, 0x47, 0xce, 0x81, 0x4c, 0x41, 0x8f,
+ 0xdf, 0x4c, 0xb9, 0x54, 0xff, 0xd7, 0xf0, 0xf0,
+ 0x37, 0x3e, 0xe4, 0x61, 0xd3, 0xef, 0xa3, 0xa9,
+ 0xc7, 0x47, 0x8f, 0xb1, 0xb2, 0x34, 0xff, 0xfd,
+ 0xed, 0xb4, 0xbd, 0x1f, 0x72, 0x7c, 0x14, 0xdd,
+ 0xa7, 0xce, 0x9f, 0xfb, 0x19, 0x7f, 0x06, 0x89,
+ 0x6e, 0xd5, 0x9d, 0x3f, 0xeb, 0x27, 0xad, 0xe4,
+ 0xfb, 0x5a, 0x1d, 0x2a, 0xe2, 0x76, 0xed, 0x42,
+ 0xa7, 0x89, 0x3e, 0xc7, 0x44, 0x79, 0xff, 0xd5,
+ 0x67, 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0xa6,
+ 0x7f, 0xf5, 0x59, 0xce, 0xae, 0x0a, 0xf7, 0x29,
+ 0xa2, 0x71, 0x9f, 0xfd, 0x56, 0x73, 0xab, 0x82,
+ 0xbd, 0xca, 0x68, 0xa0, 0x67, 0xc2, 0xbd, 0xca,
+ 0x68, 0xb8, 0x26, 0x4f, 0x1d, 0x3f, 0xbe, 0xe4,
+ 0xf6, 0xd8, 0xc3, 0xa5, 0x5c, 0x3f, 0x8b, 0x18,
+ 0x68, 0x2b, 0x3f, 0xbd, 0x5d, 0xe8, 0x0c, 0x09,
+ 0xd3, 0xfc, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x24,
+ 0x99, 0x56, 0xc7, 0xeb, 0xc6, 0x90, 0xf2, 0xed,
+ 0x6b, 0xa5, 0x8c, 0xaa, 0xab, 0x4a, 0x40, 0x52,
+ 0xa4, 0x32, 0xaf, 0x0a, 0xa9, 0xff, 0x6b, 0xea,
+ 0xe0, 0xaf, 0x72, 0x9a, 0x2d, 0x49, 0xff, 0x73,
+ 0xab, 0x82, 0xbd, 0xca, 0x68, 0x95, 0x60, 0xe9,
+ 0x57, 0x5a, 0x26, 0x18, 0x91, 0xa8, 0x8d, 0x3f,
+ 0xab, 0x82, 0xbd, 0xca, 0x68, 0x8a, 0x67, 0xf5,
+ 0x70, 0x57, 0xb9, 0x4d, 0x11, 0xa4, 0xfe, 0xae,
+ 0x0a, 0xf7, 0x29, 0xa2, 0x9f, 0x9f, 0xfd, 0x56,
+ 0x73, 0xab, 0x82, 0xbd, 0xca, 0x68, 0x9a, 0xa7,
+ 0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x15, 0xdc, 0xf2,
+ 0xf7, 0x29, 0xa2, 0xbe, 0x9c, 0x10, 0x84, 0xa9,
+ 0x7c, 0xaa, 0x97, 0x90, 0x27, 0xcc, 0xc4, 0x79,
+ 0xce, 0x47, 0xce, 0x9f, 0xf6, 0x58, 0x3d, 0x7a,
+ 0x26, 0x3c, 0x74, 0xff, 0xbb, 0xc3, 0x8f, 0x79,
+ 0xd9, 0xb1, 0xd2, 0xae, 0x22, 0xe1, 0xa2, 0x1f,
+ 0x8e, 0x50, 0xf6, 0x7f, 0xf5, 0x59, 0xce, 0xae,
+ 0x0a, 0xf7, 0x29, 0xa2, 0x7b, 0x9f, 0xd5, 0xc1,
+ 0x5e, 0xe5, 0x34, 0x5c, 0x33, 0xff, 0x57, 0x9d,
+ 0x5c, 0x15, 0xee, 0x53, 0x44, 0x9f, 0x08, 0xae,
+ 0xcd, 0xe3, 0xb7, 0x1d, 0xeb, 0x3b, 0x53, 0xb6,
+ 0x94, 0x86, 0x35, 0x9b, 0x21, 0xd1, 0x49, 0xb1,
+ 0xdc, 0xfe, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x2a,
+ 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x53, 0x33,
+ 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57, 0xb9, 0x4d,
+ 0x13, 0x3c, 0xff, 0xea, 0xb3, 0x9d, 0x5c, 0x15,
+ 0xee, 0x53, 0x45, 0x1b, 0x0f, 0x26, 0x35, 0xb1,
+ 0xde, 0xb3, 0xbb, 0xa9, 0x4f, 0xfd, 0x5e, 0x75,
+ 0x70, 0x57, 0xb9, 0x4d, 0x11, 0xd4, 0xfd, 0xec,
+ 0xfe, 0xd8, 0xf1, 0xd3, 0xe1, 0x5e, 0xe5, 0x34,
+ 0x53, 0x53, 0xf7, 0x91, 0x8f, 0x60, 0x4e, 0x9f,
+ 0xfe, 0xcb, 0xdb, 0x1c, 0x3d, 0xfb, 0xdb, 0x9c,
+ 0x74, 0xc8, 0x03, 0xa7, 0xfa, 0x9c, 0xfa, 0x2f,
+ 0x96, 0xa2, 0x88, 0xff, 0x96, 0xef, 0x4d, 0x95,
+ 0x76, 0x4d, 0x2f, 0x0b, 0xaf, 0x0b, 0xf9, 0xf0,
+ 0xaf, 0x72, 0x9a, 0x2a, 0xa9, 0xff, 0x73, 0xab,
+ 0x82, 0xbd, 0xca, 0x68, 0x9b, 0x65, 0x5c, 0x3f,
+ 0x66, 0x18, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
+ 0x2b, 0xf9, 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x45,
+ 0x8d, 0x3e, 0x15, 0xee, 0x53, 0x45, 0xab, 0x3f,
+ 0xee, 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x14, 0x14,
+ 0xab, 0x87, 0xec, 0xc3, 0x09, 0xfd, 0x5c, 0x15,
+ 0xee, 0x53, 0x45, 0xc5, 0x3f, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0xba, 0x67, 0xff, 0xdf, 0xea, 0xdd,
+ 0xd8, 0x23, 0xce, 0x7b, 0x02, 0x74, 0xfd, 0xaa,
+ 0xff, 0x2d, 0xd7, 0x3a, 0x7e, 0x07, 0x34, 0xef,
+ 0x5c, 0xe9, 0xe5, 0xee, 0x53, 0x44, 0x99, 0x3f,
+ 0xc3, 0x8f, 0xde, 0xfc, 0xea, 0x1d, 0x02, 0x7c,
+ 0x6c, 0x2b, 0x9f, 0xb6, 0x06, 0xab, 0x40, 0x37,
+ 0x9d, 0x3e, 0xcb, 0xf9, 0x9c, 0x74, 0xff, 0xfb,
+ 0x94, 0x52, 0xdf, 0xcb, 0xe5, 0x42, 0x10, 0x95,
+ 0x0e, 0x3f, 0x8b, 0x93, 0x4f, 0xfe, 0xd3, 0xfd,
+ 0x74, 0x1a, 0x59, 0x3f, 0x73, 0xa7, 0x04, 0x21,
+ 0x2a, 0x7e, 0x1e, 0x79, 0x9e, 0xa1, 0x55, 0x2f,
+ 0x27, 0xd8, 0xc1, 0xcd, 0x59, 0xd3, 0xfe, 0x62,
+ 0x2d, 0xbf, 0xa5, 0xd2, 0x87, 0x4f, 0xf6, 0x70,
+ 0x37, 0x66, 0xdc, 0xe3, 0xa7, 0xff, 0x73, 0xd6,
+ 0xf2, 0x7f, 0x1a, 0xf0, 0xf8, 0xe8, 0xc4, 0x60,
+ 0xdc, 0xf8, 0x27, 0x33, 0xf6, 0xaf, 0xf9, 0x6e,
+ 0xb9, 0xd3, 0xd7, 0x7b, 0x36, 0x3a, 0x7f, 0xbd,
+ 0xaf, 0x78, 0x81, 0x9e, 0xa1, 0xd0, 0xd1, 0xf0,
+ 0x37, 0x91, 0xce, 0x08, 0x42, 0x74, 0xff, 0xfb,
+ 0x19, 0x7f, 0xa0, 0x33, 0x6a, 0x63, 0x11, 0x4a,
+ 0xa9, 0x79, 0x18, 0x99, 0xa7, 0xa1, 0x21, 0x64,
+ 0x29, 0xfc, 0x23, 0xc3, 0xf4, 0x71, 0xd3, 0x3a,
+ 0xad, 0xc5, 0xd0, 0x64, 0x31, 0xc8, 0x48, 0xeb,
+ 0x21, 0x7e, 0x15, 0xed, 0x11, 0x73, 0x2f, 0xcf,
+ 0x29, 0x0e, 0xab, 0xc6, 0xc7, 0xbc, 0xd6, 0x7d,
+ 0x8c, 0x1c, 0xd5, 0x9d, 0x3f, 0xf6, 0x5b, 0xe8,
+ 0xf6, 0xfb, 0x5b, 0xb5, 0x67, 0x4f, 0xdc, 0xb5,
+ 0x08, 0x42, 0x74, 0xaa, 0xab, 0xd7, 0x7d, 0x3a,
+ 0xb3, 0xf8, 0x61, 0xd0, 0xa5, 0xb2, 0x54, 0x39,
+ 0x96, 0x29, 0xb4, 0x72, 0xef, 0xc2, 0xc8, 0x49,
+ 0xd8, 0x76, 0x08, 0x58, 0xd0, 0x9e, 0xe7, 0x7a,
+ 0x4f, 0x7b, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
+ 0x23, 0x59, 0xf0, 0xaf, 0x72, 0x9a, 0x2a, 0x59,
+ 0xb9, 0x4d, 0x10, 0xd4, 0xab, 0x87, 0xa3, 0xc6,
+ 0x13, 0xff, 0x57, 0x9d, 0x5c, 0x15, 0xee, 0x53,
+ 0x44, 0x7d, 0x3f, 0xab, 0x82, 0xbd, 0xca, 0x68,
+ 0xb1, 0xe7, 0xed, 0x57, 0xf9, 0x6e, 0xb9, 0xd3,
+ 0xfd, 0xfe, 0x05, 0x3a, 0xf7, 0xe3, 0xa7, 0x80,
+ 0xcf, 0x09, 0xd3, 0xff, 0xfc, 0x83, 0xfc, 0xdb,
+ 0x2d, 0x6f, 0x2d, 0xbd, 0x7a, 0x73, 0xe7, 0x47,
+ 0x91, 0x0f, 0x62, 0x19, 0xf0, 0xaf, 0x72, 0x9a,
+ 0x2d, 0x09, 0xf9, 0xb6, 0xfb, 0xfd, 0x00, 0x74,
+ 0xf9, 0x2f, 0x96, 0x43, 0xa7, 0xff, 0xb2, 0xf4,
+ 0xc6, 0xac, 0x8d, 0xb2, 0xd6, 0x43, 0xa1, 0xe3,
+ 0xf5, 0xf9, 0x2c, 0x22, 0x32, 0x72, 0x14, 0xd3,
+ 0xfd, 0xfc, 0xcb, 0xdb, 0xbf, 0xac, 0xe9, 0xfd,
+ 0x96, 0x6b, 0xd6, 0xf3, 0x0e, 0x9f, 0xce, 0xc1,
+ 0xa7, 0xd1, 0xe3, 0xa7, 0xb6, 0xcb, 0x71, 0xd3,
+ 0xfd, 0x98, 0x1c, 0x55, 0xc0, 0x9d, 0x18, 0x8b,
+ 0xb7, 0xcd, 0x38, 0xca, 0x84, 0x33, 0xd9, 0x6e,
+ 0xb9, 0xd3, 0xfb, 0x5f, 0xbf, 0xa3, 0xb2, 0x87,
+ 0x4a, 0xad, 0xc5, 0x76, 0xe8, 0x63, 0xb4, 0x2f,
+ 0xb0, 0x8e, 0xd0, 0xf9, 0xa1, 0x35, 0xe1, 0xe8,
+ 0xde, 0x79, 0xbc, 0x82, 0x7e, 0xd4, 0xf6, 0xdf,
+ 0x46, 0x8e, 0x9e, 0xcb, 0x75, 0xce, 0x96, 0xab,
+ 0x87, 0xa5, 0xf3, 0x29, 0xf0, 0xaf, 0x72, 0x9a,
+ 0x2d, 0x69, 0xff, 0x73, 0xab, 0x82, 0xbd, 0xca,
+ 0x68, 0xa0, 0xe5, 0x56, 0xe2, 0x28, 0xb0, 0xb1,
+ 0x86, 0x13, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57,
+ 0xb9, 0x4d, 0x14, 0x5c, 0xfe, 0xae, 0x0a, 0xf7,
+ 0x29, 0xa2, 0xea, 0x87, 0x2f, 0xa3, 0xac, 0x23,
+ 0x3c, 0x4c, 0xc4, 0xcb, 0x4b, 0xf2, 0x04, 0x72,
+ 0x34, 0x39, 0xba, 0x94, 0xf8, 0x57, 0xb9, 0x4d,
+ 0x11, 0x0c, 0xeb, 0x66, 0xc7, 0x4a, 0xb8, 0x79,
+ 0x8f, 0x98, 0x4f, 0xea, 0xe0, 0xaf, 0x72, 0x9a,
+ 0x23, 0x69, 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x45,
+ 0x37, 0x3f, 0xab, 0x82, 0xbd, 0xca, 0x68, 0xa8,
+ 0x27, 0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x15, 0x34,
+ 0xf8, 0x57, 0xb9, 0x4d, 0x15, 0x84, 0xfb, 0xc1,
+ 0xdb, 0x41, 0x3a, 0x7f, 0x9d, 0x5c, 0x15, 0xee,
+ 0x53, 0x44, 0x7f, 0x3b, 0x11, 0xe3, 0xa5, 0x5c,
+ 0x45, 0xaa, 0x98, 0x71, 0x4f, 0xd0, 0x67, 0xff,
+ 0x55, 0x9c, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x26,
+ 0xf9, 0xff, 0x99, 0xce, 0xae, 0x0a, 0xf7, 0x29,
+ 0xa2, 0x7e, 0x9f, 0x9b, 0xae, 0xa8, 0xd5, 0x5b,
+ 0xf1, 0xf3, 0xa7, 0xff, 0x91, 0x11, 0x11, 0x11,
+ 0x11, 0x1f, 0xa1, 0xd3, 0xe1, 0xf3, 0xdc, 0xc2,
+ 0xa6, 0x08, 0x4a, 0x8c, 0x37, 0xa1, 0x27, 0x96,
+ 0x85, 0x54, 0xd0, 0x42, 0x23, 0x1e, 0x90, 0xa6,
+ 0x9f, 0x87, 0x96, 0xde, 0x13, 0xa7, 0x9e, 0x67,
+ 0x9c, 0x74, 0xfe, 0xb2, 0x32, 0xa0, 0x02, 0x1d,
+ 0x21, 0x43, 0xd5, 0xf1, 0x1c, 0xe0, 0x53, 0x0e,
+ 0x9f, 0xfb, 0x64, 0xbf, 0x53, 0x2d, 0x6f, 0x30,
+ 0xe9, 0xd7, 0xf3, 0x47, 0x42, 0x1f, 0x0d, 0x11,
+ 0x21, 0x13, 0x69, 0xf1, 0x38, 0xbf, 0xfc, 0x9a,
+ 0xef, 0x93, 0xdc, 0xd6, 0xf6, 0x1d, 0x37, 0x7c,
+ 0xe8, 0x13, 0x72, 0xc2, 0x49, 0xc1, 0x08, 0x4e,
+ 0x9e, 0x7b, 0xfe, 0x42, 0xaa, 0x5e, 0x4f, 0x3f,
+ 0x7f, 0x29, 0xd0, 0x88, 0x8f, 0xb1, 0xe6, 0x86,
+ 0x33, 0xff, 0x3d, 0xa0, 0x33, 0xfa, 0x34, 0x97,
+ 0xe3, 0xa7, 0x92, 0xf4, 0x53, 0x44, 0x1d, 0x3f,
+ 0x75, 0x93, 0x57, 0xa3, 0x8e, 0x81, 0x45, 0x2d,
+ 0xd1, 0xdb, 0x16, 0xcc, 0x3b, 0x1d, 0x30, 0x42,
+ 0x74, 0x38, 0xd6, 0x04, 0x5a, 0x7a, 0x89, 0xe6,
+ 0xc5, 0x54, 0xd0, 0xcf, 0xa9, 0xbf, 0x60, 0x50,
+ 0xe8, 0xf1, 0xef, 0x6f, 0x33, 0x9c, 0x10, 0x84,
+ 0xa8, 0x2a, 0xa5, 0xe4, 0xf7, 0x83, 0xe6, 0x8a,
+ 0x85, 0x37, 0x9e, 0x19, 0x8f, 0x26, 0xf1, 0x68,
+ 0x6e, 0x7d, 0xf2, 0x7b, 0x6e, 0xf8, 0x0e, 0x9f,
+ 0xf9, 0x3e, 0x0f, 0xa3, 0xed, 0x27, 0xc0, 0x74,
+ 0x00, 0xf9, 0xe8, 0x45, 0x3f, 0x34, 0x98, 0x36,
+ 0xf1, 0xd3, 0xf5, 0xf1, 0xaf, 0xa3, 0x0f, 0x10,
+ 0x14, 0xfb, 0xbf, 0xb5, 0x90, 0xd1, 0x01, 0x54,
+ 0xdd, 0x4f, 0x90, 0x1e, 0x7e, 0x87, 0x4f, 0xe1,
+ 0x6a, 0x9e, 0xfd, 0xfc, 0x74, 0xf3, 0xe0, 0x14,
+ 0x2a, 0x60, 0x84, 0xa8, 0x43, 0x6e, 0x12, 0x19,
+ 0xfb, 0x85, 0xce, 0xff, 0x8a, 0xa9, 0xa0, 0x84,
+ 0x4e, 0xef, 0x08, 0xbc, 0xcd, 0xf4, 0x4b, 0x94,
+ 0x69, 0x08, 0xb9, 0xf6, 0x97, 0xd3, 0xb7, 0x9a,
+ 0x20, 0x79, 0xff, 0x5b, 0x47, 0x93, 0x72, 0x5d,
+ 0x36, 0x3a, 0x77, 0x0b, 0xc7, 0x4c, 0x10, 0x9d,
+ 0x3f, 0x87, 0xd8, 0xdb, 0x7b, 0xaa, 0xa6, 0xc4,
+ 0x23, 0x71, 0xb2, 0x2f, 0xc5, 0xce, 0x7f, 0xef,
+ 0xe6, 0xbb, 0x73, 0xb7, 0xf3, 0xe8, 0x74, 0x21,
+ 0xf5, 0x61, 0x1c, 0xff, 0xec, 0x63, 0x39, 0xd8,
+ 0x2b, 0xdc, 0xa6, 0x88, 0x62, 0x2c, 0x7e, 0x3f,
+ 0x20, 0x9f, 0xb0, 0x57, 0xb9, 0x4d, 0x10, 0x54,
+ 0xf5, 0xe8, 0x80, 0x2a, 0x77, 0x0b, 0xc5, 0x4f,
+ 0x69, 0xfe, 0xd6, 0x54, 0xfe, 0xf3, 0xd9, 0x7a,
+ 0x20, 0x0a, 0x82, 0xa7, 0xec, 0x54, 0xb2, 0x30,
+ 0xa9, 0x82, 0x12, 0xa7, 0xef, 0xa7, 0xde, 0xf0,
+ 0x95, 0x18, 0x98, 0x52, 0x90, 0xb0, 0x6e, 0xc4,
+ 0x80, 0x33, 0xf8, 0x50, 0x4a, 0xb7, 0x8b, 0x4d,
+ 0xe1, 0x2a, 0xa7, 0xe5, 0x2e, 0x72, 0x7a, 0xf6,
+ 0x8e, 0xc6, 0x7f, 0xc8, 0xee, 0xfe, 0x50, 0x52,
+ 0x87, 0x4f, 0xf9, 0x2f, 0x64, 0x6d, 0xb2, 0x01,
+ 0x0e, 0x9f, 0xff, 0x9a, 0xee, 0x77, 0x5b, 0x76,
+ 0x3d, 0xa5, 0xf4, 0xed, 0xe6, 0x8b, 0xee, 0x7d,
+ 0xeb, 0xff, 0x1c, 0x74, 0xff, 0xbf, 0xe7, 0x5e,
+ 0xd8, 0x3e, 0xa1, 0xd3, 0xfa, 0xe0, 0xdf, 0xf7,
+ 0x5b, 0x0f, 0x10, 0x0c, 0xee, 0x17, 0x1e, 0x20,
+ 0x18, 0xc3, 0xe9, 0xd1, 0x0a, 0x6e, 0x71, 0xe2,
+ 0x01, 0x9e, 0xef, 0xbe, 0xe3, 0xc4, 0x03, 0x3f,
+ 0xbc, 0xb6, 0xc0, 0x01, 0x0f, 0x10, 0x0c, 0xef,
+ 0x7f, 0x63, 0xc4, 0x03, 0x1b, 0x22, 0xe5, 0x84,
+ 0x56, 0x2f, 0x6c, 0x7d, 0x38, 0x52, 0xe7, 0x88,
+ 0x06, 0x0f, 0x10, 0x0c, 0xc8, 0xc3, 0xc4, 0x03,
+ 0x1b, 0x1b, 0x9f, 0x0b, 0xcf, 0x79, 0x9b, 0x21,
+ 0xe2, 0x01, 0x9d, 0x7e, 0x53, 0xc4, 0x03, 0x3f,
+ 0xef, 0xf3, 0xab, 0x6f, 0x2f, 0x09, 0xe2, 0x01,
+ 0x9b, 0xb6, 0x3c, 0x40, 0x33, 0xfb, 0xfc, 0x1a,
+ 0x51, 0x00, 0x78, 0x80, 0x67, 0xde, 0xd7, 0xdf,
+ 0x01, 0xe2, 0x01, 0x9b, 0xd4, 0x3c, 0x40, 0x30,
+ 0x27, 0xb3, 0x73, 0x69, 0xf5, 0xfe, 0x8f, 0xb8,
+ 0xd1, 0x00, 0xcc, 0x04, 0x3c, 0x40, 0x35, 0x36,
+ 0xb3, 0xef, 0x23, 0x3b, 0x63, 0xc4, 0x03, 0x3d,
+ 0xa7, 0x7d, 0x4f, 0x10, 0x0c, 0xe4, 0x15, 0x3c,
+ 0x40, 0x33, 0xfe, 0xc7, 0xe9, 0xb2, 0x67, 0xc1,
+ 0x43, 0xc4, 0x03, 0x3e, 0xd3, 0x9c, 0xe4, 0x3c,
+ 0x40, 0x31, 0x88, 0x80, 0xb2, 0x64, 0xc2, 0x03,
+ 0xc4, 0x03, 0x0e, 0x55, 0x1f, 0xb1, 0x1e, 0x42,
+ 0x63, 0xca, 0xd6, 0x32, 0x01, 0xa5, 0x0b, 0xaf,
+ 0x0a, 0x6d, 0x08, 0xa7, 0xd9, 0x7a, 0x73, 0xe7,
+ 0x88, 0x06, 0x7f, 0x6c, 0x8a, 0xd0, 0xa5, 0xcf,
+ 0x10, 0x0e, 0xc6, 0xd2, 0x70, 0xa0, 0x4f, 0x10,
+ 0x0c, 0x29, 0xfb, 0x8a, 0x84, 0xf7, 0xbe, 0xea,
+ 0x1e, 0x20, 0x19, 0xfb, 0x9a, 0x76, 0x3e, 0xe3,
+ 0xc4, 0x03, 0x18, 0x88, 0xa0, 0x10, 0x68, 0x5f,
+ 0x3f, 0xfb, 0x9e, 0xda, 0xc9, 0x4a, 0xd3, 0x41,
+ 0x01, 0xe2, 0x01, 0x98, 0x40, 0x78, 0x80, 0x67,
+ 0xdd, 0x7a, 0x79, 0xf3, 0xc4, 0x03, 0x3f, 0x7b,
+ 0xfa, 0x3b, 0x28, 0x78, 0x80, 0x61, 0x11, 0x25,
+ 0xf2, 0x2b, 0x9a, 0xc6, 0xcb, 0xfa, 0xb9, 0x0d,
+ 0xb6, 0x90, 0x05, 0x82, 0xc4, 0x5c, 0x5e, 0x02,
+ 0x7a, 0x4a, 0xd8, 0xbc, 0x78, 0x0d, 0xe6, 0x1b,
+ 0xe1, 0xd7, 0x3b, 0xb9, 0x4d, 0x10, 0x0d, 0x51,
+ 0x6d, 0x3d, 0xaf, 0x54, 0xb6, 0x61, 0xd3, 0x01,
+ 0x0a, 0x96, 0xb2, 0xa7, 0x59, 0x1e, 0x3a, 0x60,
+ 0x84, 0xa8, 0xf1, 0xec, 0xea, 0xc5, 0x5a, 0x12,
+ 0x08, 0xe4, 0xe6, 0x7a, 0x85, 0x54, 0xf0, 0x67,
+ 0xaf, 0x4d, 0x4d, 0x0e, 0x87, 0x99, 0x55, 0x4e,
+ 0x27, 0x5a, 0x49, 0x97, 0x8e, 0x01, 0x0c, 0x6d,
+ 0xe5, 0xb3, 0xf0, 0xb4, 0xe4, 0x17, 0x8e, 0x9f,
+ 0xf3, 0xa9, 0xbb, 0xf8, 0xc4, 0x1d, 0x67, 0x4f,
+ 0xdb, 0xc2, 0x3e, 0xcb, 0x15, 0x3c, 0xd5, 0xb9,
+ 0xa3, 0xa7, 0xd8, 0xd3, 0x91, 0xf3, 0xa7, 0xb3,
+ 0xe8, 0xe2, 0xa0, 0x4f, 0xaf, 0xe4, 0x7a, 0x85,
+ 0x10, 0x89, 0x9c, 0x61, 0x6d, 0x90, 0x7a, 0x13,
+ 0x33, 0xde, 0xfd, 0xe8, 0x74, 0xed, 0x1b, 0xba,
+ 0x1d, 0x3f, 0xf0, 0x19, 0x8b, 0x6f, 0x6d, 0x6d,
+ 0x35, 0x9d, 0x3f, 0xf5, 0xe9, 0x9b, 0x23, 0xf4,
+ 0xc7, 0xee, 0x74, 0x22, 0x2c, 0x3c, 0x45, 0xc9,
+ 0x13, 0xee, 0x6d, 0xb6, 0xc8, 0x74, 0xd4, 0xa1,
+ 0xd3, 0x82, 0x10, 0x9d, 0x30, 0x38, 0xaa, 0x97,
+ 0x90, 0x27, 0xad, 0x43, 0x29, 0xdc, 0x0c, 0x2a,
+ 0x1c, 0x8b, 0xb6, 0x42, 0x01, 0xbc, 0x86, 0x7f,
+ 0x5f, 0xf8, 0xf8, 0x37, 0xb8, 0xe9, 0xfe, 0xfe,
+ 0x36, 0xca, 0x84, 0x21, 0x2a, 0x73, 0x3a, 0xe7,
+ 0x45, 0x8f, 0x55, 0xb1, 0xd4, 0x22, 0x39, 0xfc,
+ 0x71, 0xd0, 0x8b, 0x9a, 0xdc, 0x74, 0xcd, 0x50,
+ 0xe9, 0xfa, 0xb8, 0xdb, 0xdf, 0xdb, 0x0d, 0x66,
+ 0xf1, 0x59, 0xed, 0xb2, 0xdc, 0x74, 0xff, 0xc9,
+ 0x9f, 0x75, 0xb3, 0xff, 0x40, 0x9d, 0x2f, 0x0a,
+ 0x2a, 0xfe, 0x91, 0x72, 0x18, 0x79, 0xb5, 0x50,
+ 0x74, 0x7a, 0x5b, 0x47, 0xf3, 0xac, 0xbd, 0x4e,
+ 0xfc, 0x7e, 0x34, 0xb1, 0x8b, 0x47, 0x46, 0x04,
+ 0x0f, 0xc3, 0x4a, 0xf1, 0xe8, 0x36, 0x8c, 0x2a,
+ 0x7e, 0xf8, 0x33, 0x6e, 0x71, 0xd3, 0xed, 0xed,
+ 0x39, 0x35, 0x65, 0x46, 0x1e, 0xde, 0xf2, 0xd9,
+ 0xff, 0xc3, 0xaf, 0xfa, 0x76, 0xfc, 0xa7, 0x93,
+ 0xe7, 0x4b, 0x79, 0xa2, 0x05, 0x95, 0xcd, 0x40,
+ 0xa4, 0xbd, 0x73, 0x78, 0x11, 0xf9, 0xff, 0x79,
+ 0xbe, 0xde, 0xdf, 0x50, 0x01, 0x0a, 0x9f, 0xfd,
+ 0x7a, 0x73, 0xfb, 0x98, 0x99, 0xfb, 0xb7, 0x9d,
+ 0x08, 0x89, 0x3f, 0x22, 0x4e, 0x7b, 0xee, 0x3a,
+ 0x11, 0x38, 0x26, 0x42, 0x26, 0xd0, 0xba, 0xd0,
+ 0x8a, 0x7f, 0x39, 0xac, 0xff, 0x5b, 0x0e, 0x9f,
+ 0xfc, 0x2b, 0xfc, 0x6d, 0xfc, 0x41, 0x4a, 0x1d,
+ 0x3f, 0xb9, 0xab, 0x63, 0x32, 0x87, 0x46, 0x1f,
+ 0xcb, 0x64, 0x79, 0xf6, 0x6d, 0xe1, 0xa1, 0xd3,
+ 0xff, 0xd4, 0xbb, 0xeb, 0xeb, 0x6e, 0xd4, 0xcb,
+ 0x79, 0x87, 0x49, 0x1e, 0x3f, 0xd0, 0x93, 0xc7,
+ 0x91, 0x91, 0x78, 0x50, 0x4e, 0xdb, 0x84, 0xe9,
+ 0xf0, 0x3b, 0xf9, 0xa8, 0x74, 0x21, 0xe2, 0x68,
+ 0x37, 0x3c, 0x8c, 0x7d, 0xa3, 0xa1, 0x15, 0x12,
+ 0x3a, 0x37, 0x3a, 0x36, 0x5c, 0x8a, 0x78, 0x1c,
+ 0xfd, 0x0e, 0x98, 0x21, 0x3a, 0x28, 0x6e, 0x02,
+ 0x45, 0x3f, 0x53, 0xd6, 0xec, 0xb1, 0x55, 0x34,
+ 0x33, 0x82, 0x10, 0x95, 0x3c, 0xeb, 0xe2, 0x95,
+ 0x52, 0xf2, 0x7d, 0x9b, 0x78, 0x14, 0x3a, 0x5c,
+ 0x27, 0xaf, 0xf2, 0xf9, 0xfb, 0xef, 0xd1, 0xac,
+ 0xb9, 0xd3, 0xe7, 0xb5, 0x7e, 0xc7, 0xce, 0x9f,
+ 0xf6, 0x2e, 0xd8, 0x21, 0xeb, 0x34, 0x74, 0xce,
+ 0x78, 0xa8, 0x7c, 0xf5, 0x3e, 0x7b, 0x02, 0x8a,
+ 0x4e, 0x84, 0x0c, 0x22, 0x63, 0xf8, 0x4d, 0xd0,
+ 0xd3, 0x9f, 0xf6, 0xb4, 0x7f, 0xe9, 0x6b, 0x68,
+ 0xa7, 0x4f, 0xdf, 0xed, 0x76, 0xe7, 0x1d, 0x38,
+ 0x21, 0x09, 0x53, 0xb7, 0xa0, 0x0a, 0xa9, 0x79,
+ 0x3f, 0xef, 0xf3, 0xb7, 0x8e, 0x36, 0xe1, 0x3a,
+ 0x7f, 0xbf, 0xc0, 0xdc, 0xe4, 0x03, 0xe7, 0x46,
+ 0xc9, 0x98, 0xb1, 0x04, 0x09, 0x5f, 0x2c, 0xb9,
+ 0xfc, 0xe0, 0x84, 0x25, 0x88, 0x42, 0x7c, 0x2b,
+ 0xdc, 0xa5, 0x88, 0x42, 0xa6, 0xa6, 0x70, 0x42,
+ 0x12, 0xc4, 0x1f, 0x05, 0x88, 0x3e, 0xa6, 0xa6,
+ 0x64, 0x66, 0x22, 0x41, 0x5a, 0x67, 0xd7, 0x4b,
+ 0xa3, 0x0e, 0x9e, 0xff, 0x93, 0x59, 0xd3, 0xb7,
+ 0xa0, 0x0e, 0x87, 0x8f, 0x01, 0x84, 0x73, 0xe5,
+ 0x4b, 0x23, 0x0a, 0x9f, 0x7f, 0xbf, 0xfc, 0x2a,
+ 0x6c, 0x52, 0xa6, 0x08, 0x4a, 0x8c, 0x3f, 0x5a,
+ 0x12, 0xdc, 0x98, 0x22, 0x93, 0xfb, 0xfb, 0xd0,
+ 0x16, 0xcd, 0x42, 0xaa, 0x6e, 0xe1, 0x13, 0x80,
+ 0xf3, 0x37, 0x43, 0x4e, 0x7f, 0xf5, 0x90, 0x14,
+ 0xcc, 0xdb, 0xbf, 0xda, 0xce, 0x9f, 0xd4, 0xde,
+ 0xca, 0x07, 0x9f, 0x3a, 0x11, 0x5b, 0x2f, 0xa3,
+ 0x05, 0x18, 0xeb, 0x38, 0xd2, 0x89, 0x53, 0x82,
+ 0x10, 0x95, 0x3e, 0x70, 0x3b, 0xfb, 0x15, 0x52,
+ 0xf2, 0x7f, 0xfb, 0xef, 0xee, 0x7c, 0x09, 0xf5,
+ 0xe7, 0xbf, 0xc7, 0x4f, 0xff, 0x9d, 0x89, 0x5d,
+ 0xbe, 0x9a, 0x2e, 0x6b, 0xf0, 0x9d, 0x3d, 0xed,
+ 0xb1, 0x87, 0x42, 0x26, 0x04, 0xe3, 0x7e, 0x53,
+ 0xd1, 0x5a, 0x7e, 0xd5, 0xd3, 0xdf, 0x7d, 0xc7,
+ 0x4f, 0xfa, 0x94, 0x41, 0xba, 0x57, 0x6f, 0x1d,
+ 0x3f, 0xef, 0xf3, 0x56, 0xe1, 0x1f, 0x6c, 0x74,
+ 0x62, 0x2b, 0xfc, 0x66, 0xc3, 0xe9, 0xfb, 0x87,
+ 0x6c, 0xcf, 0x9d, 0x3f, 0xfd, 0x97, 0xa6, 0x35,
+ 0x64, 0x6d, 0x96, 0xb2, 0x1d, 0x3f, 0xae, 0xdd,
+ 0x5a, 0xfb, 0x74, 0x7b, 0x43, 0xa3, 0x64, 0x5f,
+ 0x7c, 0xae, 0xea, 0x13, 0xff, 0xde, 0xa6, 0x6d,
+ 0x7a, 0x7b, 0x5d, 0xbb, 0xfe, 0x3a, 0x7f, 0xff,
+ 0x7e, 0xf9, 0x6f, 0x25, 0xfc, 0x04, 0x75, 0x42,
+ 0x10, 0x95, 0x3d, 0xb6, 0x66, 0xb2, 0xa7, 0x3b,
+ 0xfa, 0x1a, 0x21, 0x99, 0xc1, 0x08, 0x4a, 0x9d,
+ 0x9f, 0x52, 0xaa, 0x5e, 0x4f, 0xfb, 0x1e, 0xcd,
+ 0xb9, 0xdf, 0x47, 0x8e, 0x80, 0x1f, 0x47, 0xca,
+ 0x61, 0x13, 0x54, 0x79, 0x85, 0xf2, 0x31, 0x85,
+ 0x74, 0xf7, 0xaf, 0xe4, 0x3a, 0x7f, 0x69, 0x82,
+ 0x00, 0x7b, 0xe7, 0x4f, 0xff, 0x91, 0xde, 0xda,
+ 0xdb, 0xe9, 0x82, 0xbd, 0xca, 0x68, 0x83, 0x22,
+ 0xc8, 0x94, 0xb9, 0x9c, 0xfe, 0x6f, 0xca, 0x37,
+ 0xe0, 0xa1, 0xd0, 0xe4, 0xc3, 0xbd, 0x0b, 0x5b,
+ 0x91, 0xcf, 0xff, 0x27, 0xde, 0xdc, 0xd7, 0xbf,
+ 0x9b, 0x67, 0xf5, 0x9d, 0x39, 0x05, 0xa3, 0xa1,
+ 0x17, 0x2f, 0x72, 0x1d, 0xaa, 0x63, 0xe8, 0xe9,
+ 0xfa, 0x35, 0x1d, 0x0d, 0x9b, 0xd5, 0xa7, 0xf5,
+ 0xfc, 0xdb, 0xd7, 0x72, 0x15, 0x26, 0x1d, 0x3f,
+ 0xa9, 0x9f, 0xd6, 0x29, 0x5f, 0x1e, 0x2e, 0xf3,
+ 0x59, 0xe1, 0xd1, 0xf7, 0x1d, 0x3f, 0xbe, 0xef,
+ 0xe3, 0x11, 0x4e, 0x9c, 0xcd, 0xb0, 0xe8, 0x43,
+ 0xf0, 0xc2, 0x3e, 0x31, 0x9f, 0xf6, 0x97, 0xa6,
+ 0xf1, 0x03, 0x3d, 0x43, 0xa7, 0xfe, 0x4f, 0xf5,
+ 0x90, 0x15, 0x1a, 0x50, 0xa8, 0xd9, 0x10, 0x8c,
+ 0x42, 0x9f, 0x5b, 0xde, 0x7e, 0x87, 0x41, 0x53,
+ 0xf5, 0x37, 0xa0, 0xa3, 0x0a, 0x82, 0xa0, 0xa8,
+ 0x2a, 0x0a, 0x87, 0x1e, 0xff, 0x82, 0x80, 0x5b,
+ 0xa0, 0x53, 0x78, 0x56, 0xa0, 0x54, 0xd6, 0xc2,
+ 0xa7, 0xee, 0xeb, 0xb4, 0x8c, 0x2b, 0x71, 0x6b,
+ 0x26, 0xec, 0xa8, 0x2a, 0x0a, 0x87, 0x16, 0x9e,
+ 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x82, 0xa0,
+ 0xa8, 0x78, 0xde, 0x6c, 0x15, 0xe0, 0xa0, 0x05,
+ 0x50, 0x29, 0xb0, 0x54, 0x15, 0x05, 0x43, 0x8b,
+ 0x4a, 0x05, 0x41, 0x50, 0x54, 0x15, 0x05, 0x43,
+ 0x8d, 0x40, 0x02, 0xae, 0x15, 0xa8, 0x15, 0x05,
+ 0x41, 0x50, 0x54, 0x15, 0x0f, 0x1a, 0x8d, 0x61,
+ 0x42, 0x15, 0x60, 0xa9, 0x6b, 0x2a, 0x0a, 0x82,
+ 0xa0, 0xa8, 0x2a, 0x36, 0x35, 0x0f, 0x85, 0x00,
+ 0x2b, 0x40, 0xa8, 0x2a, 0x0a, 0x82, 0xa7, 0xd6,
+ 0x40, 0x53, 0x0a, 0x82, 0xa1, 0xc7, 0x9c, 0xa1,
+ 0x56, 0x0a, 0xe0, 0xa0, 0x13, 0x49, 0x4a, 0x82,
+ 0xa0, 0xa8, 0x2a, 0x0a, 0x87, 0x1a, 0x87, 0xc2,
+ 0xbc, 0x14, 0xd8, 0x2a, 0x0a, 0x82, 0xa0, 0xa8,
+ 0x2a, 0x1c, 0x6a, 0x36, 0x0a, 0xb0, 0x57, 0xc2,
+ 0xa5, 0x62, 0xa0, 0xa8, 0x2a, 0x4e, 0x2a, 0x0a,
+ 0x7c, 0xb0, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x87,
+ 0x8f, 0x99, 0xc1, 0x5a, 0xc6, 0x94, 0x69, 0xa0,
+ 0xa0, 0x05, 0x5c, 0x2a, 0x58, 0x54, 0x15, 0x05,
+ 0x49, 0xc5, 0x41, 0x4f, 0x96, 0x10, 0x54, 0x15,
+ 0x08, 0x7a, 0x4e, 0x0a, 0xf0, 0xd0, 0x8d, 0x30,
+ 0x2a, 0x0a, 0x82, 0xa0, 0xa8, 0x2a, 0x0a, 0x84,
+ 0x36, 0x4f, 0x85, 0x08, 0x53, 0x02, 0xbe, 0x15,
+ 0x05, 0x41, 0x50, 0x54, 0x09, 0x7d, 0x40, 0xab,
+ 0x85, 0x41, 0x50, 0x54, 0x15, 0x0c, 0x2f, 0xbe,
+ 0x15, 0x70, 0xa9, 0x30, 0xa8, 0x2a, 0x0a, 0x80,
+ 0x16, 0x9a, 0x05, 0x41, 0x50, 0x54, 0x15, 0x05,
+ 0x42, 0x1a, 0x86, 0x82, 0xac, 0x15, 0xa0, 0x54,
+ 0x22, 0xfd, 0x6b, 0xce, 0x4e, 0x3d, 0xd8, 0xa7,
+ 0x17, 0x15, 0xb5, 0xf4, 0x8f, 0x33, 0x6a, 0xcf,
+ 0x5a, 0x3a, 0x18, 0x46, 0x31, 0x1e, 0xc6, 0xfc,
+ 0xcc, 0x03, 0xcf, 0xbb, 0x51, 0x9a, 0xec, 0x3a,
+ 0x3c, 0xb6, 0x65, 0x0a, 0x53, 0x79, 0x6e, 0xf2,
+ 0x4d, 0x44, 0x99, 0xf3, 0xbe, 0x99, 0x42, 0xaa,
+ 0x9a, 0xbc, 0xef, 0x23, 0x0a, 0x9e, 0xf2, 0xf0,
+ 0x9d, 0x3b, 0xdb, 0x61, 0xd3, 0x93, 0x7d, 0x5f,
+ 0x44, 0x78, 0x9c, 0xd8, 0x6e, 0xe3, 0xf3, 0xfa,
+ 0xde, 0x0e, 0xc2, 0x8f, 0x1d, 0x0f, 0xa2, 0x11,
+ 0xa5, 0x09, 0x80, 0x87, 0x4f, 0xc3, 0xdf, 0xde,
+ 0x80, 0x3a, 0x6e, 0x13, 0xa5, 0xe3, 0x94, 0xb4,
+ 0x92, 0x9d, 0x26, 0x1d, 0x3b, 0x1b, 0xeb, 0xe4,
+ 0x49, 0x88, 0xad, 0x90, 0x78, 0x7b, 0x78, 0x7c,
+ 0xff, 0xfb, 0x44, 0xdd, 0xc2, 0x3c, 0x04, 0xa8,
+ 0x42, 0x13, 0xa1, 0xcc, 0xd9, 0xbd, 0xa1, 0x7b,
+ 0xe8, 0x58, 0x34, 0x49, 0xd4, 0xa9, 0xff, 0xc2,
+ 0xe2, 0xeb, 0xd3, 0xf9, 0x3f, 0x7e, 0xfe, 0x98,
+ 0x74, 0xfc, 0xef, 0xf9, 0xd6, 0xc3, 0xa7, 0xcf,
+ 0x78, 0x51, 0xc7, 0x40, 0x9e, 0xa7, 0xcb, 0x67,
+ 0xfd, 0x64, 0x10, 0x7f, 0x03, 0xc0, 0x3a, 0x76,
+ 0x63, 0x47, 0x4b, 0x2c, 0x7a, 0xe0, 0x3c, 0x9f,
+ 0xa9, 0x8d, 0xbe, 0x8f, 0x9d, 0x24, 0xc4, 0x67,
+ 0x7d, 0xe2, 0xe4, 0xf3, 0xda, 0x70, 0xb8, 0xe9,
+ 0xe4, 0xd1, 0xbb, 0xa1, 0x53, 0xe7, 0x54, 0x21,
+ 0x09, 0xd1, 0xf3, 0xcf, 0xd0, 0x9e, 0x36, 0x44,
+ 0x9e, 0x38, 0x43, 0x15, 0x1f, 0x02, 0x35, 0x4d,
+ 0x21, 0x8f, 0x3f, 0x0e, 0x80, 0xcf, 0xa9, 0xd3,
+ 0xdb, 0x6c, 0x8d, 0x8e, 0x9f, 0xff, 0x25, 0x91,
+ 0x8a, 0x97, 0xc1, 0x5e, 0xe5, 0x34, 0x5f, 0x13,
+ 0xf8, 0x3d, 0x7a, 0x26, 0x3c, 0x74, 0xff, 0xfd,
+ 0x97, 0xde, 0xe4, 0x6d, 0xef, 0x80, 0x7c, 0x8c,
+ 0xc2, 0xa6, 0xbe, 0x1d, 0x3e, 0x1f, 0x3d, 0xcc,
+ 0x34, 0xc2, 0x73, 0xd7, 0xd1, 0x38, 0xd3, 0x09,
+ 0xcc, 0x04, 0x35, 0x02, 0x73, 0xfb, 0xfd, 0xae,
+ 0xe8, 0x20, 0x35, 0x02, 0x73, 0xfa, 0x99, 0x6f,
+ 0x53, 0x47, 0x8d, 0x30, 0x9c, 0xd9, 0xb1, 0xa6,
+ 0x13, 0x98, 0x21, 0x3c, 0xc2, 0x71, 0x89, 0xa6,
+ 0x3e, 0x69, 0xe2, 0xe6, 0x11, 0x51, 0x01, 0xb2,
+ 0x10, 0x48, 0xe5, 0x72, 0xcc, 0x27, 0x53, 0xe7,
+ 0x97, 0x9f, 0x4f, 0xd8, 0x31, 0xe4, 0x45, 0x15,
+ 0x42, 0x5e, 0x52, 0x9c, 0x6c, 0xad, 0x89, 0x49,
+ 0x6c, 0xb7, 0x79, 0x56, 0xd3, 0xed, 0xb0, 0x7d,
+ 0xac, 0xe9, 0xf7, 0xf3, 0x7e, 0x34, 0x74, 0xfe,
+ 0x06, 0xff, 0xb9, 0xbf, 0x9e, 0x3a, 0x3e, 0x7c,
+ 0x57, 0x29, 0x84, 0x5c, 0x81, 0xc9, 0x71, 0xde,
+ 0x46, 0xe8, 0x45, 0xcf, 0xfe, 0x65, 0xe9, 0xef,
+ 0xbe, 0xeb, 0xfa, 0x9e, 0x3a, 0x7f, 0xff, 0x7f,
+ 0x1f, 0xca, 0x77, 0xed, 0xe4, 0xbd, 0xb4, 0xe6,
+ 0x1d, 0x3f, 0xfe, 0xef, 0xdf, 0xba, 0xdf, 0x4b,
+ 0xd0, 0x39, 0x63, 0xa7, 0x0d, 0x28, 0x78, 0x80,
+ 0xe7, 0xff, 0xb7, 0x8a, 0x59, 0x37, 0x60, 0xaf,
+ 0x72, 0x9a, 0x20, 0x3a, 0x9a, 0x89, 0x78, 0x08,
+ 0xe5, 0xbb, 0xdc, 0xff, 0xff, 0xbf, 0xce, 0xcf,
+ 0xb4, 0xec, 0x7d, 0xdb, 0xd0, 0x15, 0x08, 0x42,
+ 0x54, 0xfe, 0x4c, 0x15, 0xee, 0x53, 0x44, 0x13,
+ 0x3f, 0xc9, 0x7c, 0x15, 0xee, 0x53, 0x45, 0xf3,
+ 0x3e, 0xf3, 0x6f, 0xe5, 0x36, 0x3f, 0xa5, 0x3a,
+ 0x9f, 0xf3, 0xdc, 0xfb, 0x7e, 0x5f, 0xfc, 0xd8,
+ 0xe9, 0xc1, 0x08, 0x4a, 0x9f, 0xaf, 0x6c, 0x5e,
+ 0x12, 0xaa, 0x5e, 0x43, 0xc8, 0x99, 0xfb, 0x04,
+ 0xff, 0xcf, 0x31, 0x1f, 0xa7, 0xf1, 0xed, 0xee,
+ 0x3a, 0x7f, 0xfb, 0x7b, 0xff, 0xdc, 0xb6, 0xf0,
+ 0x00, 0x82, 0xe3, 0xa7, 0x04, 0x21, 0x2a, 0x7f,
+ 0x6f, 0x02, 0x7f, 0x1f, 0xb9, 0x55, 0x2f, 0x27,
+ 0xff, 0xe6, 0xef, 0x72, 0xdb, 0xdb, 0x6d, 0x81,
+ 0xdd, 0x7a, 0x63, 0xc7, 0x4b, 0xac, 0x8a, 0xbd,
+ 0x11, 0x21, 0xca, 0xa2, 0xfd, 0x0d, 0xa1, 0x24,
+ 0x62, 0x4d, 0xe3, 0x1b, 0x9f, 0xf6, 0x5d, 0x06,
+ 0x96, 0x4f, 0xdc, 0xf1, 0x04, 0x4f, 0xe4, 0xc1,
+ 0x5e, 0xe5, 0x34, 0x41, 0x15, 0x3c, 0x99, 0xfd,
+ 0xfe, 0xb0, 0x8f, 0x82, 0x74, 0x00, 0xff, 0x3e,
+ 0x97, 0x3f, 0xc9, 0xfb, 0xef, 0xcb, 0x73, 0xe7,
+ 0x4f, 0xff, 0x70, 0x6f, 0x96, 0x4f, 0x5f, 0xf9,
+ 0x6f, 0x1d, 0x0e, 0x44, 0x47, 0xce, 0xa7, 0xf5,
+ 0xf7, 0xb2, 0x81, 0xe7, 0xce, 0x9e, 0xf3, 0x5e,
+ 0x09, 0xd3, 0xff, 0xed, 0x1e, 0xfa, 0x65, 0xaa,
+ 0x97, 0xcb, 0x68, 0x27, 0x4f, 0xb2, 0xf4, 0xdf,
+ 0x4d, 0x8f, 0xe7, 0x79, 0x1c, 0xfc, 0xb6, 0xf3,
+ 0x7f, 0xb5, 0x9d, 0x3f, 0x31, 0x35, 0x76, 0xc7,
+ 0x8e, 0x9f, 0xff, 0xfe, 0xf5, 0xf9, 0x9d, 0xf0,
+ 0x3b, 0xd4, 0xd1, 0x96, 0xf2, 0x5e, 0xda, 0x73,
+ 0x0e, 0x8d, 0x91, 0xc7, 0xe3, 0x2e, 0x31, 0x9c,
+ 0x3b, 0xe8, 0x74, 0xff, 0xbb, 0xeb, 0x82, 0xbd,
+ 0xca, 0x68, 0x84, 0x61, 0x0f, 0x8b, 0x41, 0xd9,
+ 0xff, 0xc9, 0x8f, 0xef, 0xbf, 0xbf, 0xa3, 0xb2,
+ 0x87, 0x4f, 0xff, 0x77, 0x3d, 0xbf, 0x2d, 0xcc,
+ 0xa8, 0x42, 0x13, 0xa5, 0x9b, 0x22, 0x79, 0xa4,
+ 0xd9, 0xc1, 0x08, 0x4a, 0x9f, 0xec, 0x07, 0x0e,
+ 0x36, 0xcd, 0x8a, 0xa9, 0x79, 0x30, 0x42, 0x54,
+ 0xe0, 0x84, 0x25, 0x4f, 0xdc, 0xf6, 0xd6, 0x4a,
+ 0x15, 0x52, 0xf2, 0x3e, 0x8b, 0x60, 0xa3, 0xb7,
+ 0x99, 0x4f, 0x97, 0xdb, 0x6f, 0x61, 0x55, 0x36,
+ 0x73, 0x82, 0x10, 0x95, 0x3a, 0x88, 0x25, 0x54,
+ 0xbc, 0x90, 0x3c, 0x7f, 0xf7, 0x56, 0x9f, 0xb6,
+ 0xfa, 0x3b, 0x94, 0xe9, 0xfd, 0xbc, 0x76, 0xf3,
+ 0x64, 0xd8, 0xe9, 0xfd, 0x7b, 0x63, 0x6c, 0xbd,
+ 0x0e, 0x81, 0x44, 0xc5, 0x8b, 0x3e, 0x71, 0x08,
+ 0x8e, 0xfc, 0x86, 0x04, 0xe7, 0xf5, 0x4e, 0xdd,
+ 0x4e, 0x9f, 0xfd, 0x9a, 0xbe, 0xf8, 0x31, 0x52,
+ 0xc8, 0xc3, 0xa7, 0xe5, 0xf5, 0x2d, 0xe6, 0x8a,
+ 0x9f, 0xdf, 0xc7, 0xdd, 0x4f, 0x6b, 0x3a, 0x7b,
+ 0xb8, 0x75, 0x9d, 0x1b, 0x8f, 0x5d, 0xe3, 0x69,
+ 0xe4, 0xe6, 0x36, 0x2a, 0x70, 0x42, 0x12, 0xa7,
+ 0xff, 0xb7, 0xa0, 0x33, 0x3f, 0x7b, 0x79, 0x3e,
+ 0xf1, 0x55, 0x2f, 0x25, 0x8a, 0x89, 0xe6, 0x1f,
+ 0x42, 0x27, 0xc8, 0xe2, 0xb7, 0xd2, 0xbd, 0x08,
+ 0x5b, 0x43, 0x0e, 0x7f, 0xfc, 0xcc, 0x54, 0xff,
+ 0x5e, 0x9b, 0x69, 0xc2, 0xe3, 0xa7, 0xc9, 0x7a,
+ 0x36, 0xc3, 0xa1, 0x0f, 0xf2, 0xea, 0x93, 0xff,
+ 0xde, 0x6d, 0x9f, 0xdb, 0xfc, 0x1c, 0xff, 0x6b,
+ 0x3a, 0x7f, 0xff, 0xb6, 0xb7, 0x83, 0x9a, 0x9e,
+ 0x67, 0x5e, 0x9a, 0x3b, 0x1f, 0xb9, 0xd1, 0x88,
+ 0xc0, 0xe5, 0x38, 0x46, 0xc2, 0xed, 0xe4, 0xd7,
+ 0x46, 0x8d, 0xb1, 0x4e, 0x4b, 0x75, 0xf4, 0x63,
+ 0x6d, 0x42, 0xa8, 0x48, 0xd9, 0x0a, 0xfb, 0x46,
+ 0x4e, 0x08, 0x49, 0x7e, 0x18, 0x14, 0x95, 0x3b,
+ 0x79, 0x41, 0x5a, 0x43, 0x44, 0x30, 0xe1, 0x9c,
+ 0xd9, 0x3e, 0x74, 0xff, 0xf6, 0x7e, 0xb7, 0xd7,
+ 0xe7, 0xe9, 0x6c, 0x07, 0x1d, 0x27, 0xdc, 0x7d,
+ 0xfb, 0x0e, 0xcf, 0xd6, 0x6b, 0xd6, 0xf3, 0x0e,
+ 0x9f, 0xf7, 0xd2, 0xf6, 0xe0, 0x73, 0xf4, 0x3a,
+ 0x7f, 0xea, 0x77, 0x87, 0x1f, 0xa8, 0x42, 0x13,
+ 0xa7, 0xff, 0xbe, 0x8e, 0xdd, 0xbe, 0xfe, 0xfe,
+ 0x8e, 0xca, 0x1d, 0x18, 0x98, 0x32, 0x97, 0xd8,
+ 0xf8, 0x08, 0x93, 0xf9, 0x3e, 0xef, 0xe6, 0x00,
+ 0xe9, 0xfc, 0xec, 0x1a, 0x7d, 0x1e, 0x3a, 0x7f,
+ 0xf9, 0x1b, 0x20, 0xd7, 0x7d, 0xff, 0x8f, 0x78,
+ 0x4f, 0x77, 0xbc, 0xff, 0xf6, 0x5d, 0x3e, 0xb9,
+ 0x7b, 0x78, 0x40, 0xa7, 0x4f, 0xba, 0x99, 0xfb,
+ 0x9d, 0x3a, 0xfd, 0xab, 0x3a, 0x7f, 0x5e, 0xde,
+ 0xa8, 0x3b, 0xc7, 0x43, 0xc9, 0x91, 0xec, 0xbf,
+ 0xf4, 0xcb, 0x93, 0x68, 0x3f, 0x3f, 0xff, 0x7f,
+ 0x29, 0xa6, 0xec, 0xb7, 0x7f, 0x1a, 0x72, 0x3e,
+ 0x74, 0xff, 0xb2, 0x9a, 0x60, 0xaf, 0x72, 0x9a,
+ 0x20, 0x69, 0xf6, 0x5e, 0xdc, 0xed, 0xc8, 0xa5,
+ 0xfa, 0xf4, 0xff, 0xff, 0xfd, 0x97, 0xb7, 0x7f,
+ 0x5e, 0xea, 0x0f, 0x75, 0xdb, 0x66, 0xdb, 0xb1,
+ 0x9d, 0xf7, 0xdc, 0x78, 0x82, 0xe7, 0xfd, 0xdd,
+ 0xad, 0x7b, 0x6d, 0xda, 0xc2, 0x78, 0x82, 0xe7,
+ 0xfe, 0xb7, 0xad, 0xe4, 0xfd, 0xf7, 0x6b, 0x09,
+ 0xe2, 0x0b, 0x9f, 0xc9, 0xef, 0xdf, 0x76, 0xb0,
+ 0x9e, 0x20, 0xb9, 0xf9, 0x99, 0xb6, 0xed, 0x61,
+ 0x3c, 0x41, 0x73, 0xff, 0xfd, 0xdf, 0xff, 0x99,
+ 0xba, 0x8b, 0x6f, 0x0f, 0xb5, 0xbd, 0x81, 0x3c,
+ 0x41, 0x73, 0x3f, 0xbb, 0x64, 0xe8, 0x55, 0x40,
+ 0x55, 0xb9, 0x13, 0xe7, 0xf1, 0x65, 0x52, 0xdf,
+ 0x94, 0x7d, 0x3d, 0xc2, 0x0e, 0x3a, 0x7f, 0xeb,
+ 0x7a, 0xde, 0x4f, 0xdf, 0x76, 0xb0, 0x9e, 0x20,
+ 0xb9, 0xfe, 0x6a, 0x8b, 0xe7, 0xb7, 0x6b, 0x09,
+ 0xe2, 0x0b, 0x9f, 0x5e, 0x88, 0xcd, 0xca, 0x8a,
+ 0x2d, 0xea, 0xd3, 0xff, 0xb7, 0x2d, 0xbc, 0xa9,
+ 0x7a, 0x6e, 0xd6, 0x13, 0xc4, 0x17, 0x3f, 0xff,
+ 0xf7, 0xff, 0xe6, 0x6e, 0xd3, 0x37, 0x51, 0x6d,
+ 0xe1, 0xf6, 0xb7, 0xb0, 0x27, 0x88, 0x2e, 0x31,
+ 0x32, 0x67, 0xd0, 0xf9, 0x72, 0x7f, 0xad, 0xe1,
+ 0xf6, 0xb7, 0xb0, 0x27, 0x88, 0x2e, 0x7f, 0xfb,
+ 0xb9, 0xf7, 0x52, 0xde, 0xdb, 0x64, 0x14, 0x2a,
+ 0x7f, 0xd8, 0xe7, 0x69, 0x41, 0xfb, 0xcd, 0xe7,
+ 0x88, 0x2e, 0x15, 0x1d, 0x02, 0x91, 0x45, 0x09,
+ 0xff, 0x2f, 0x86, 0xfc, 0x0a, 0x6e, 0x09, 0xe2,
+ 0x0b, 0x9f, 0xad, 0xeb, 0x5b, 0xc0, 0x34, 0x01,
+ 0x73, 0xec, 0x06, 0xed, 0x61, 0x3c, 0x41, 0x73,
+ 0x65, 0xd4, 0xfc, 0xec, 0x77, 0x0f, 0xa3, 0xae,
+ 0x90, 0xbf, 0x9f, 0x99, 0x9b, 0x6e, 0xd6, 0x13,
+ 0xc4, 0x17, 0x3f, 0xe5, 0xb7, 0x87, 0xda, 0xde,
+ 0xc0, 0x9e, 0x20, 0xb9, 0xb3, 0x77, 0x22, 0x32,
+ 0x87, 0xf3, 0xfb, 0x4f, 0x33, 0xbe, 0xfb, 0x8f,
+ 0x10, 0x5c, 0xff, 0xb3, 0xcd, 0xb3, 0xf9, 0xb7,
+ 0x38, 0xf1, 0x05, 0xb0, 0xf0, 0xa3, 0x65, 0xdc,
+ 0x70, 0x16, 0x7e, 0x3e, 0x7a, 0x46, 0x31, 0x78,
+ 0xc6, 0x74, 0x85, 0xa8, 0x5c, 0x67, 0xc0, 0xa0,
+ 0x00, 0x86, 0x88, 0x2e, 0xa8, 0x80, 0x9f, 0xf6,
+ 0x3a, 0xdc, 0xed, 0x4d, 0x4d, 0x1e, 0x3a, 0x7f,
+ 0x0f, 0xf3, 0x6b, 0x68, 0x13, 0xa7, 0xcf, 0xdf,
+ 0x84, 0x07, 0x4f, 0xd8, 0xf7, 0x59, 0x35, 0x67,
+ 0x47, 0x91, 0x17, 0xc6, 0x9f, 0x27, 0x9d, 0xc2,
+ 0xf1, 0xd3, 0x01, 0x0e, 0x9e, 0xf2, 0x33, 0x0e,
+ 0x83, 0xa7, 0xee, 0xd7, 0x74, 0x10, 0x1d, 0x1b,
+ 0x1b, 0x7f, 0x85, 0x4f, 0xff, 0xe4, 0xf6, 0xdf,
+ 0x4d, 0x16, 0xf8, 0xbb, 0x22, 0xef, 0x61, 0xd3,
+ 0x01, 0x0e, 0x99, 0x35, 0x9d, 0x3f, 0xd9, 0x7a,
+ 0x23, 0x37, 0xe3, 0x47, 0x4f, 0xea, 0x65, 0xbd,
+ 0x4d, 0x1e, 0x3a, 0x60, 0x84, 0xa9, 0xfe, 0xfe,
+ 0x36, 0xe7, 0x53, 0xdb, 0x1d, 0x0a, 0x9f, 0xbf,
+ 0x86, 0xc4, 0x55, 0x8a, 0xf6, 0x22, 0x03, 0x13,
+ 0x76, 0x2b, 0xf1, 0x7a, 0x1d, 0x04, 0xd7, 0x78,
+ 0xb4, 0xe0, 0x84, 0x25, 0x49, 0x85, 0x54, 0xbc,
+ 0x9f, 0x73, 0x5d, 0xc2, 0x55, 0x51, 0xb3, 0xbe,
+ 0x17, 0x53, 0xf9, 0xfb, 0xa6, 0x5b, 0x1e, 0x3a,
+ 0x11, 0xb1, 0x97, 0xc8, 0xcc, 0x35, 0x9e, 0x3e,
+ 0x63, 0xe8, 0xd5, 0x6d, 0x0f, 0x3e, 0xa4, 0x8f,
+ 0x7d, 0x1a, 0x90, 0xd1, 0xd2, 0x57, 0xfb, 0x64,
+ 0xb9, 0xec, 0x54, 0xb9, 0xd3, 0xd8, 0xcc, 0xb9,
+ 0xd3, 0xdc, 0xf6, 0xf7, 0x1d, 0x08, 0x7c, 0x6f,
+ 0x8f, 0xea, 0x10, 0x4f, 0xdf, 0xd3, 0x66, 0x73,
+ 0x8e, 0x9f, 0xfe, 0x7d, 0xdf, 0x4d, 0xcc, 0xfa,
+ 0x6b, 0xbf, 0x9e, 0x3a, 0x11, 0x10, 0xbe, 0x2f,
+ 0x9d, 0xdb, 0xb7, 0x9d, 0x3f, 0xfd, 0xf7, 0x6e,
+ 0xcd, 0xbd, 0x47, 0xef, 0xa7, 0x50, 0xe8, 0xdc,
+ 0x7e, 0x98, 0x3f, 0x3f, 0x3c, 0xd3, 0x9b, 0x82,
+ 0xf1, 0xd3, 0x39, 0xe3, 0xa7, 0xd6, 0xcf, 0x3a,
+ 0x87, 0x4f, 0xff, 0x59, 0x37, 0xd6, 0xff, 0xe0,
+ 0x52, 0x88, 0x02, 0xa7, 0xf0, 0x30, 0x57, 0xb9,
+ 0x4f, 0x10, 0x24, 0x39, 0x16, 0x7b, 0x13, 0x8a,
+ 0x8c, 0xf5, 0xde, 0xef, 0x9d, 0x3c, 0xfd, 0x3a,
+ 0xe7, 0x46, 0x1e, 0x25, 0x88, 0xa7, 0xf7, 0xf8,
+ 0x34, 0xa2, 0x00, 0xe9, 0xc1, 0x08, 0x4f, 0x87,
+ 0xd4, 0xee, 0xfe, 0xc5, 0xc3, 0xea, 0xa6, 0xa6,
+ 0x36, 0x44, 0xa0, 0x16, 0xe7, 0xff, 0xd9, 0xff,
+ 0x6b, 0xad, 0x2f, 0x6d, 0x39, 0xce, 0x43, 0xa1,
+ 0xe3, 0xfc, 0xd6, 0x49, 0x1a, 0xa1, 0x56, 0x43,
+ 0x8d, 0x32, 0x19, 0x5e, 0x74, 0xe8, 0xcc, 0x67,
+ 0xde, 0xba, 0x5e, 0x85, 0x4f, 0x2a, 0x5e, 0x85,
+ 0x4c, 0x10, 0x95, 0x0e, 0x3d, 0xdc, 0x27, 0x09,
+ 0x04, 0xd8, 0x12, 0xaa, 0x6b, 0xa7, 0xff, 0xd9,
+ 0x74, 0x5c, 0xcf, 0xde, 0xde, 0x4f, 0xbc, 0x74,
+ 0x00, 0xfe, 0x02, 0x4b, 0x3f, 0xff, 0x91, 0xb7,
+ 0xbe, 0x0d, 0xd7, 0xa6, 0x2d, 0xbb, 0xf7, 0xa1,
+ 0xd3, 0xf9, 0xa7, 0xdd, 0x6d, 0x10, 0x4e, 0x9c,
+ 0xee, 0x13, 0xa7, 0xce, 0xcb, 0xe6, 0xc5, 0x4b,
+ 0xcd, 0x1e, 0x0d, 0xc6, 0xa6, 0x02, 0x1d, 0x30,
+ 0x10, 0xe9, 0xfb, 0xfa, 0x3b, 0x3f, 0x5f, 0x1a,
+ 0xa0, 0x0a, 0xcf, 0xfd, 0x7b, 0x63, 0x37, 0xa0,
+ 0x31, 0xfb, 0x9d, 0x3f, 0x9f, 0x5f, 0x0e, 0xf4,
+ 0xd8, 0xe9, 0xe0, 0x33, 0x9d, 0x43, 0xfb, 0xba,
+ 0x34, 0xe6, 0xfc, 0x7c, 0xe8, 0x43, 0xd8, 0xe3,
+ 0x99, 0xc1, 0x08, 0x4a, 0x9f, 0x93, 0x35, 0xff,
+ 0x4a, 0x15, 0x52, 0xf2, 0x78, 0x3d, 0xf7, 0x1d,
+ 0x32, 0xd8, 0xe9, 0xc1, 0x08, 0x4a, 0x9f, 0xbd,
+ 0xda, 0xed, 0xeb, 0x95, 0x52, 0xf2, 0x7d, 0x80,
+ 0xcc, 0x68, 0xe9, 0x53, 0x72, 0x25, 0x44, 0xc7,
+ 0xe7, 0xd3, 0xde, 0xfe, 0x8e, 0xd9, 0x1d, 0xb9,
+ 0x0b, 0x68, 0x45, 0xc0, 0xf7, 0x11, 0x63, 0x26,
+ 0xb7, 0x61, 0x53, 0xb4, 0x63, 0x14, 0x3c, 0xbc,
+ 0x65, 0x73, 0xf2, 0x30, 0x47, 0xae, 0x74, 0xff,
+ 0xf7, 0x98, 0xfb, 0xa9, 0xbb, 0x3f, 0xfc, 0xf0,
+ 0x0e, 0x8b, 0x1f, 0xed, 0xca, 0xa5, 0x56, 0xe8,
+ 0xfe, 0xeb, 0x49, 0x29, 0xc9, 0xe8, 0xc4, 0x5d,
+ 0x29, 0x37, 0x69, 0x4b, 0x19, 0x5a, 0xd6, 0x6b,
+ 0x8c, 0xd5, 0x63, 0xa5, 0x7e, 0x53, 0x67, 0xa1,
+ 0x3a, 0xd4, 0x79, 0xc3, 0x39, 0x92, 0xc8, 0xdc,
+ 0xed, 0x3b, 0x53, 0xd4, 0xe5, 0x80, 0x4a, 0xbf,
+ 0xfc, 0xe5, 0xfd, 0x2b, 0x10, 0x4b, 0xd6, 0x65,
+ 0x5a, 0x46, 0x52, 0xda, 0x16, 0xe1, 0x84, 0xb3,
+ 0x7c, 0xae, 0xbd, 0xf3, 0xad, 0xba, 0x90, 0xfc,
+ 0x8a, 0xbf, 0xcd, 0xe3, 0xaf, 0xde, 0x9a, 0x7f,
+ 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x71, 0xcf, 0xea,
+ 0xe0, 0xaf, 0x72, 0x9a, 0x2e, 0xb9, 0xff, 0xab,
+ 0xce, 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x51, 0x84,
+ 0x7f, 0xd0, 0xf7, 0x14, 0x6c, 0x77, 0xac, 0xed,
+ 0x4e, 0xfd, 0x0f, 0x0d, 0x5a, 0x07, 0x5f, 0xd0,
+ 0x75, 0x0d, 0xae, 0x77, 0xa8, 0x77, 0x3f, 0xfa,
+ 0xac, 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x2d,
+ 0x4f, 0x85, 0x7b, 0x94, 0xd1, 0x1b, 0xcf, 0xfb,
+ 0x9d, 0x5c, 0x15, 0xee, 0x53, 0x44, 0xbf, 0x2a,
+ 0xe1, 0xfb, 0x30, 0xc2, 0x7f, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x55, 0xcf, 0xf6, 0xbc, 0xfe, 0x3f,
+ 0x7e, 0x61, 0xd3, 0x6d, 0xe3, 0xa7, 0xec, 0x15,
+ 0xee, 0x53, 0x44, 0x81, 0x1b, 0x8f, 0x32, 0xa2,
+ 0xf3, 0xea, 0x77, 0xf9, 0xf3, 0xa1, 0xc7, 0x96,
+ 0xf9, 0x24, 0x6b, 0x47, 0xa7, 0x43, 0x46, 0x7f,
+ 0xef, 0xe3, 0xd5, 0x6f, 0x4f, 0xff, 0x2e, 0x74,
+ 0x54, 0xfc, 0x04, 0xa6, 0x7f, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x64, 0x4f, 0xea, 0xe0, 0xaf, 0x72,
+ 0x9a, 0x2d, 0x79, 0xfd, 0x5c, 0x15, 0xee, 0x53,
+ 0x45, 0xc9, 0x3e, 0x15, 0xee, 0x53, 0x45, 0xd9,
+ 0x3f, 0xee, 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x14,
+ 0x74, 0xab, 0x87, 0xec, 0xc3, 0x09, 0xf0, 0xaf,
+ 0x72, 0x9a, 0x29, 0x59, 0xff, 0xff, 0xeb, 0x23,
+ 0xc9, 0x6f, 0x36, 0xed, 0xad, 0xea, 0xad, 0xbc,
+ 0xd5, 0x91, 0xec, 0x3a, 0x7d, 0x56, 0x73, 0xab,
+ 0x88, 0xb2, 0x68, 0xc2, 0x1e, 0x5c, 0xef, 0x74,
+ 0x32, 0x1f, 0x27, 0xf4, 0x73, 0xec, 0x21, 0x01,
+ 0xdd, 0x0e, 0xef, 0x0b, 0x16, 0xd0, 0xd9, 0x9f,
+ 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x1c, 0x4f,
+ 0xf7, 0xab, 0x82, 0xbd, 0xca, 0x68, 0xad, 0x65,
+ 0x5e, 0x44, 0x15, 0xd0, 0x67, 0xff, 0x55, 0x9c,
+ 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x25, 0xb9, 0xb1,
+ 0xf3, 0xa7, 0xf6, 0xd8, 0xc6, 0x27, 0xa8, 0x74,
+ 0x3e, 0x79, 0x3e, 0x16, 0x9d, 0x6d, 0x9c, 0x74,
+ 0xe7, 0x31, 0x4e, 0x83, 0x44, 0x37, 0x3f, 0xee,
+ 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x13, 0x04, 0xe1,
+ 0xd0, 0x05, 0x4f, 0xef, 0xe5, 0xee, 0x83, 0x43,
+ 0xa5, 0x54, 0x4c, 0x15, 0xe2, 0x3d, 0x87, 0x54,
+ 0x6d, 0x82, 0xf7, 0x46, 0xde, 0x39, 0x39, 0x9a,
+ 0x09, 0x53, 0xfe, 0xe7, 0x57, 0x05, 0x7b, 0x94,
+ 0xd1, 0x31, 0xca, 0xbe, 0x3e, 0x26, 0x0e, 0x4f,
+ 0xc9, 0x4d, 0xd7, 0xcb, 0x1d, 0x3f, 0xff, 0xfc,
+ 0xea, 0x5b, 0x34, 0x0d, 0x2d, 0x8b, 0x94, 0xdd,
+ 0x8f, 0xba, 0x9e, 0xff, 0x8e, 0x9e, 0x5e, 0xe5,
+ 0x34, 0x56, 0x33, 0xfe, 0x6f, 0xcb, 0xff, 0x34,
+ 0x4f, 0xdc, 0xe8, 0xd6, 0x98, 0xdb, 0xe5, 0xc3,
+ 0x08, 0x1b, 0x95, 0xcf, 0xfe, 0x4f, 0xdf, 0x5e,
+ 0x89, 0xfc, 0x54, 0x13, 0xa7, 0xfd, 0x9b, 0x5b,
+ 0x28, 0xfb, 0x92, 0xc7, 0x4f, 0xff, 0xfd, 0xfd,
+ 0x1e, 0xc5, 0xdd, 0xfd, 0x35, 0x37, 0x63, 0xee,
+ 0xcd, 0x3e, 0x0a, 0x1d, 0x3f, 0xb5, 0x43, 0xcd,
+ 0x39, 0xb8, 0x2f, 0x1d, 0x3a, 0xde, 0xae, 0x27,
+ 0x16, 0xa8, 0xb6, 0x49, 0xb9, 0xfb, 0x7b, 0xf4,
+ 0xda, 0x34, 0x74, 0xfb, 0xbe, 0xf6, 0x94, 0x3a,
+ 0x3e, 0x78, 0x34, 0x18, 0x9f, 0x06, 0x94, 0x40,
+ 0x1d, 0x3e, 0x47, 0x03, 0x47, 0x1d, 0x39, 0x3e,
+ 0xe3, 0xa1, 0xa3, 0xc3, 0xb9, 0x44, 0xfc, 0x8c,
+ 0xcf, 0xfb, 0x59, 0xd2, 0xa1, 0xd1, 0xe3, 0x7d,
+ 0xc5, 0xd3, 0x01, 0x0a, 0x98, 0x21, 0x2a, 0x3c,
+ 0x6a, 0xc2, 0x2b, 0x3f, 0xb9, 0xdf, 0xcb, 0xdb,
+ 0xc5, 0x54, 0xd0, 0xcf, 0x6d, 0xcf, 0xd0, 0xe9,
+ 0xc9, 0xf6, 0x8e, 0x9b, 0xe8, 0x74, 0x34, 0x6c,
+ 0x44, 0x72, 0x78, 0x41, 0x9a, 0x87, 0x4e, 0xde,
+ 0x3a, 0xce, 0x84, 0x45, 0xbe, 0x2a, 0x78, 0x86,
+ 0xc4, 0x73, 0x5a, 0xe7, 0x4e, 0x08, 0x42, 0x54,
+ 0xff, 0xd8, 0xbb, 0x23, 0xdb, 0xf2, 0xdc, 0xf9,
+ 0x55, 0x2f, 0x24, 0x27, 0x4f, 0x99, 0xeb, 0x83,
+ 0x8e, 0x8d, 0x59, 0xb6, 0xd0, 0x3e, 0x7f, 0x2f,
+ 0xa9, 0xfc, 0x6d, 0xc7, 0x4d, 0x97, 0x3a, 0x1f,
+ 0x3c, 0x8b, 0x19, 0xcf, 0xff, 0x5f, 0xd4, 0xb6,
+ 0x6d, 0xfc, 0x6d, 0xfc, 0xa1, 0xd2, 0xaa, 0x2e,
+ 0x16, 0xec, 0x45, 0x8d, 0x42, 0xc2, 0xc6, 0xcb,
+ 0x43, 0xe7, 0x8e, 0xfe, 0x65, 0x48, 0x45, 0xdd,
+ 0xbb, 0x79, 0x1c, 0xf8, 0x57, 0xb9, 0x4d, 0x15,
+ 0xbc, 0xff, 0xb9, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
+ 0x4e, 0x12, 0xae, 0x1f, 0xb3, 0x0c, 0x27, 0xc2,
+ 0xbd, 0xca, 0x68, 0xb4, 0x67, 0xb1, 0xaf, 0x6b,
+ 0x3a, 0x55, 0xc3, 0xd4, 0xb1, 0x84, 0xf2, 0xf7,
+ 0x29, 0xa2, 0xda, 0x9f, 0xac, 0x8c, 0x4f, 0x6c,
+ 0x74, 0xd5, 0xc1, 0x3d, 0x8b, 0x95, 0xcf, 0xea,
+ 0xe0, 0xaf, 0x72, 0x9a, 0x2e, 0x59, 0xfd, 0x5c,
+ 0x15, 0xee, 0x53, 0x45, 0xdb, 0x08, 0xcc, 0xed,
+ 0x78, 0xa1, 0xd1, 0xd0, 0x6d, 0x0c, 0xfd, 0x72,
+ 0xb3, 0xbd, 0x39, 0x99, 0xab, 0x8c, 0x82, 0xcf,
+ 0x7f, 0x7f, 0xa1, 0x65, 0xce, 0xe7, 0xf5, 0x70,
+ 0x57, 0xb9, 0x4d, 0x15, 0x3c, 0xf2, 0xf7, 0x29,
+ 0xa2, 0xb9, 0x9f, 0xd5, 0xc1, 0x5e, 0xe5, 0x34,
+ 0x59, 0xd0, 0x27, 0xcd, 0x62, 0xb9, 0xf0, 0xaf,
+ 0x72, 0x9a, 0x24, 0x29, 0xfe, 0xf3, 0xf4, 0xbf,
+ 0xd1, 0x94, 0x3a, 0x67, 0x57, 0x0f, 0xa8, 0x06,
+ 0x13, 0xcd, 0xd2, 0xc8, 0xc3, 0xa7, 0xf6, 0x5a,
+ 0x94, 0xc1, 0x78, 0xe9, 0x57, 0x13, 0x11, 0xe8,
+ 0x45, 0xd0, 0xb6, 0xe4, 0xf3, 0xff, 0xaa, 0xce,
+ 0x75, 0x70, 0x57, 0xb9, 0x4d, 0x13, 0xe4, 0x2a,
+ 0xa4, 0xbd, 0x5c, 0x76, 0x56, 0x47, 0x9f, 0x0a,
+ 0xf7, 0x29, 0xa2, 0xb2, 0x9f, 0xf7, 0x3a, 0xb8,
+ 0x2b, 0xdc, 0xa6, 0x89, 0xba, 0x6f, 0x57, 0x0f,
+ 0xd9, 0x86, 0x13, 0xe1, 0x5e, 0xe5, 0x34, 0x4a,
+ 0xd3, 0xfd, 0xae, 0xde, 0xdd, 0xa2, 0xe5, 0x0e,
+ 0x9f, 0x55, 0x9c, 0xea, 0xe1, 0xf6, 0xf1, 0x84,
+ 0xf8, 0x57, 0xb9, 0x4d, 0x12, 0xe4, 0xf3, 0x6f,
+ 0x7d, 0x0e, 0x9f, 0x55, 0x9c, 0xea, 0xe1, 0xe9,
+ 0xf1, 0x84, 0xff, 0xd5, 0xe7, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x1d, 0xcf, 0xf5, 0xed, 0x8e, 0xaf,
+ 0x7e, 0x87, 0x4f, 0xcd, 0xcf, 0xa2, 0xe7, 0xce,
+ 0x9f, 0xb5, 0x5f, 0xe5, 0xba, 0xe7, 0x4f, 0x85,
+ 0x7b, 0x94, 0xd1, 0x50, 0xcf, 0xb2, 0xd7, 0xc7,
+ 0x8e, 0x95, 0x75, 0x54, 0x5b, 0xb7, 0x0b, 0xf0,
+ 0xc6, 0xe6, 0x13, 0xe1, 0x5e, 0xe5, 0x34, 0x55,
+ 0x13, 0xfe, 0xe7, 0x57, 0x05, 0x7b, 0x94, 0xd1,
+ 0x35, 0xca, 0xb8, 0x7e, 0xcc, 0x30, 0x9f, 0xd5,
+ 0xc1, 0x5e, 0xe5, 0x34, 0x55, 0x93, 0xff, 0x57,
+ 0x9d, 0x5c, 0x15, 0xee, 0x53, 0x44, 0x89, 0x3e,
+ 0x15, 0xee, 0x53, 0x45, 0xa5, 0x3f, 0xee, 0x75,
+ 0x70, 0x57, 0xb9, 0x4d, 0x13, 0xec, 0xab, 0x87,
+ 0xec, 0xc3, 0x09, 0xff, 0xd5, 0x67, 0x3a, 0xb8,
+ 0x2b, 0xdc, 0xa6, 0x8a, 0x12, 0x7d, 0x6f, 0x3c,
+ 0x82, 0x74, 0xf8, 0x57, 0xb9, 0x4d, 0x14, 0x7c,
+ 0xff, 0xfd, 0x9b, 0x59, 0x37, 0xd6, 0xff, 0xe0,
+ 0x52, 0x88, 0x02, 0xa7, 0xd5, 0x67, 0x3a, 0xa8,
+ 0x8b, 0x4c, 0x27, 0x6f, 0x30, 0x84, 0x5d, 0x68,
+ 0x7a, 0x12, 0x0e, 0x3d, 0xc4, 0xcd, 0x70, 0xef,
+ 0x58, 0x60, 0xbe, 0x4e, 0xd1, 0xdd, 0xa1, 0x84,
+ 0x02, 0x7b, 0xc6, 0x0d, 0x3f, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0x88, 0xa7, 0xec, 0x15, 0xee, 0x53,
+ 0x44, 0x57, 0x3f, 0xda, 0xba, 0xe0, 0xaf, 0x72,
+ 0x9a, 0x2b, 0x88, 0xa9, 0xfd, 0x71, 0xac, 0xf6,
+ 0x5b, 0xae, 0x74, 0xfe, 0xcf, 0x08, 0x01, 0xa5,
+ 0x0e, 0x96, 0xab, 0xf3, 0xd3, 0xa1, 0x04, 0xff,
+ 0xdd, 0xe7, 0x7b, 0xf7, 0xd2, 0xc3, 0x87, 0x4f,
+ 0xb3, 0xdb, 0x0e, 0x1d, 0x3a, 0xf4, 0xf5, 0x8f,
+ 0xaa, 0xe8, 0x93, 0xe1, 0x5e, 0xe5, 0x34, 0x53,
+ 0xd0, 0xdc, 0x47, 0xda, 0x42, 0x5f, 0x0d, 0x27,
+ 0xff, 0x73, 0xab, 0xb7, 0xf8, 0x34, 0xa2, 0x00,
+ 0xe8, 0xaa, 0x20, 0x76, 0x37, 0x9d, 0x5d, 0xb0,
+ 0xe9, 0xf2, 0x38, 0x1a, 0x38, 0xe9, 0xe5, 0xee,
+ 0x53, 0x45, 0x67, 0x0d, 0x1e, 0x98, 0x94, 0x4f,
+ 0xcf, 0x31, 0x3e, 0xea, 0x1d, 0x39, 0x1e, 0xf1,
+ 0xd3, 0xeb, 0x83, 0x7f, 0xdc, 0x74, 0xfb, 0x1a,
+ 0x7b, 0x40, 0x1d, 0x2a, 0xe2, 0x30, 0x04, 0x8a,
+ 0xc5, 0xdc, 0x39, 0xbc, 0xaa, 0x7f, 0xea, 0xf3,
+ 0xab, 0x82, 0xbd, 0xca, 0x68, 0x91, 0x67, 0xf5,
+ 0x70, 0x57, 0xb9, 0x4d, 0x16, 0x4c, 0xfe, 0xae,
+ 0x0a, 0xf7, 0x29, 0xa2, 0xd8, 0x9d, 0x94, 0xc3,
+ 0xa7, 0xc2, 0xbd, 0xca, 0x68, 0xb6, 0xe5, 0x57,
+ 0x1e, 0x56, 0x0d, 0x4f, 0xf9, 0xb8, 0xdc, 0xd5,
+ 0x2b, 0xdb, 0x3e, 0x80, 0x3a, 0x7e, 0x4f, 0xbb,
+ 0x6d, 0x18, 0x74, 0xf8, 0x57, 0xb9, 0x4d, 0x17,
+ 0x84, 0xf5, 0xdb, 0xf2, 0xc7, 0x4f, 0xb3, 0xe0,
+ 0xd4, 0x43, 0xa7, 0xc9, 0xbf, 0x4e, 0xa1, 0xd3,
+ 0xae, 0x80, 0x3a, 0x55, 0xd5, 0x35, 0x33, 0xd7,
+ 0x93, 0x70, 0xbd, 0xf3, 0x00, 0x12, 0x7c, 0xa6,
+ 0xe5, 0x33, 0xbd, 0x8f, 0x9d, 0x3e, 0x15, 0xee,
+ 0x53, 0x45, 0xe9, 0x3f, 0xef, 0xf5, 0xdc, 0x9a,
+ 0xef, 0xe7, 0x8e, 0x9f, 0x63, 0x2d, 0xdb, 0x1d,
+ 0x2a, 0xec, 0x8b, 0x4c, 0x1c, 0xde, 0x61, 0xa8,
+ 0x83, 0x08, 0xc8, 0x28, 0x7a, 0x16, 0xb9, 0x1f,
+ 0x82, 0x92, 0x7a, 0x32, 0xf1, 0x4f, 0x62, 0x60,
+ 0x0e, 0xff, 0x08, 0x5d, 0x23, 0x64, 0x0c, 0x65,
+ 0x33, 0xd9, 0x6e, 0xb9, 0xd3, 0xfb, 0x3c, 0x20,
+ 0x06, 0x94, 0x3a, 0x5a, 0xaf, 0xcf, 0x4e, 0x84,
+ 0x13, 0xe1, 0x5e, 0xe5, 0x34, 0x44, 0x73, 0xff,
+ 0xd6, 0xd2, 0x94, 0xc6, 0x7f, 0x1b, 0x6e, 0x46,
+ 0xea, 0x74, 0xff, 0x9c, 0x8f, 0x0e, 0x5e, 0xfe,
+ 0xb9, 0xd3, 0xff, 0xfc, 0x96, 0xef, 0x5d, 0x2d,
+ 0xfc, 0xbd, 0xbd, 0x6c, 0xf0, 0x4e, 0x99, 0xe6,
+ 0x15, 0x30, 0x42, 0x54, 0xff, 0xce, 0xaa, 0xdb,
+ 0xcd, 0x59, 0x1e, 0xa8, 0x0d, 0x68, 0x45, 0xe7,
+ 0xf6, 0x6a, 0xff, 0x96, 0xeb, 0x9d, 0x3f, 0xff,
+ 0x2d, 0x47, 0xbf, 0xeb, 0xd4, 0x52, 0xff, 0xe0,
+ 0x1d, 0x0d, 0xc5, 0x4e, 0x38, 0x5a, 0xa6, 0x0f,
+ 0xad, 0x09, 0xf7, 0x42, 0x4a, 0xeb, 0xad, 0x8d,
+ 0x67, 0xc2, 0xbd, 0xca, 0x68, 0x8b, 0xa7, 0xd7,
+ 0x06, 0xff, 0xb8, 0xb6, 0x7b, 0x4a, 0xb8, 0x7c,
+ 0xfc, 0x61, 0x15, 0x4c, 0x21, 0xd0, 0xe2, 0x9f,
+ 0xf9, 0x9c, 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x26,
+ 0x69, 0xcf, 0xa5, 0x0e, 0x9c, 0xbe, 0x61, 0xd3,
+ 0xe5, 0xeb, 0x79, 0xa3, 0xa7, 0xfe, 0xd4, 0xf5,
+ 0xfc, 0xbe, 0xda, 0xf8, 0xa7, 0x4f, 0xff, 0xf6,
+ 0x9d, 0xf5, 0xfe, 0x6d, 0x6d, 0x37, 0x59, 0x1c,
+ 0x28, 0xf1, 0xd1, 0x88, 0xb1, 0xb2, 0x3c, 0xff,
+ 0xfb, 0x6f, 0x7d, 0xec, 0xa7, 0xba, 0xd5, 0x08,
+ 0x42, 0x54, 0xf2, 0xf7, 0x29, 0xa2, 0xcf, 0x9f,
+ 0xfe, 0xf0, 0xdb, 0xb7, 0x63, 0x6f, 0xe5, 0x33,
+ 0xe7, 0x4e, 0x08, 0x42, 0x54, 0xff, 0xb9, 0xd4,
+ 0xfe, 0x2e, 0xd8, 0x25, 0x54, 0xbc, 0x9f, 0xe4,
+ 0xb7, 0xb6, 0xff, 0x73, 0x47, 0x4f, 0xf7, 0xbf,
+ 0xb6, 0xfd, 0xb4, 0xbd, 0x0e, 0x85, 0x4e, 0xcc,
+ 0x56, 0x2c, 0x56, 0x06, 0xdb, 0xa5, 0xb6, 0x39,
+ 0x9f, 0xff, 0xff, 0xb3, 0x01, 0x4c, 0xcf, 0xeb,
+ 0xde, 0x3f, 0x4c, 0xb5, 0x69, 0xfc, 0x79, 0x98,
+ 0xc3, 0xa7, 0x51, 0x1e, 0x3a, 0x73, 0x7e, 0x58,
+ 0xe8, 0x72, 0x31, 0x29, 0x08, 0xab, 0x8e, 0x4f,
+ 0x3e, 0x0d, 0x14, 0xe9, 0xf5, 0xbe, 0x98, 0x26,
+ 0x4f, 0xfb, 0xc2, 0xec, 0x17, 0xb4, 0xed, 0x8d,
+ 0x10, 0x6d, 0x4d, 0x2c, 0xfb, 0x97, 0xcc, 0x43,
+ 0xa7, 0xe7, 0x5b, 0xfc, 0xfd, 0xce, 0x96, 0x29,
+ 0xe9, 0xfc, 0x96, 0x7f, 0xff, 0xdc, 0x1b, 0xe5,
+ 0xae, 0x99, 0xf7, 0xef, 0x83, 0xe7, 0xb9, 0x87,
+ 0x43, 0x93, 0x40, 0xc8, 0x57, 0xfc, 0x9a, 0x7e,
+ 0x1c, 0xda, 0x96, 0x43, 0xa7, 0xff, 0xf6, 0x9f,
+ 0xed, 0x7b, 0xb7, 0xff, 0xaf, 0x4f, 0x3f, 0x6f,
+ 0x04, 0xe9, 0xff, 0xfe, 0xa5, 0x10, 0x6e, 0x95,
+ 0x66, 0x5e, 0x9b, 0xe9, 0xce, 0xc3, 0xa7, 0xad,
+ 0x9e, 0x6c, 0x74, 0x79, 0x11, 0x36, 0x66, 0x99,
+ 0x9a, 0xa9, 0xa2, 0xfc, 0x9f, 0xf9, 0xd7, 0xd1,
+ 0xce, 0x65, 0xee, 0x8c, 0x3a, 0x7f, 0xef, 0x67,
+ 0xf3, 0x29, 0xb9, 0xd4, 0x61, 0xd0, 0xfa, 0x22,
+ 0xe8, 0x8d, 0x3d, 0xff, 0xa2, 0x9d, 0x08, 0x98,
+ 0xd6, 0xc4, 0x79, 0x0b, 0x3e, 0x24, 0x9f, 0xff,
+ 0xfb, 0x51, 0x2d, 0xe6, 0x55, 0xa7, 0x70, 0xef,
+ 0xb7, 0x9f, 0xa2, 0xf9, 0xe3, 0xa7, 0xda, 0x65,
+ 0x3d, 0xf3, 0xa7, 0xc9, 0xbf, 0x4e, 0xa1, 0xd3,
+ 0x37, 0x6c, 0x3a, 0x7f, 0xff, 0xd6, 0xf3, 0xf7,
+ 0xc7, 0xee, 0x22, 0x97, 0x06, 0xff, 0xba, 0xd8,
+ 0x74, 0xe0, 0x84, 0x25, 0x4f, 0x6d, 0xb7, 0x7c,
+ 0xaa, 0x97, 0x90, 0x88, 0xd8, 0x51, 0xbf, 0x42,
+ 0x2e, 0x7f, 0xec, 0xfb, 0xf7, 0xc1, 0xf3, 0xdc,
+ 0xc3, 0xa7, 0xd9, 0x77, 0x32, 0xc7, 0x42, 0x1f,
+ 0x5d, 0x11, 0x26, 0x05, 0x8e, 0x9f, 0x9e, 0x69,
+ 0xcd, 0xc1, 0x78, 0xe9, 0xfd, 0xae, 0xd9, 0x7b,
+ 0x7a, 0xe7, 0x4d, 0xe1, 0x3a, 0x35, 0x41, 0xff,
+ 0x78, 0xd2, 0xc6, 0xb3, 0xff, 0xb6, 0xd9, 0x36,
+ 0x14, 0xbf, 0x97, 0xdb, 0x1d, 0x2a, 0xb7, 0x46,
+ 0x5f, 0x1e, 0xa9, 0x0e, 0x3c, 0x37, 0xb4, 0x36,
+ 0x32, 0x3d, 0x57, 0xe3, 0x1c, 0xf1, 0xab, 0x51,
+ 0xc4, 0x09, 0xab, 0x0b, 0x2d, 0x28, 0x37, 0x90,
+ 0x40, 0xf5, 0xf2, 0x8a, 0x46, 0x03, 0x78, 0x4f,
+ 0x04, 0x85, 0xbe, 0x12, 0x9b, 0xcd, 0x62, 0xac,
+ 0xd7, 0xab, 0x53, 0x0b, 0xe7, 0xff, 0x55, 0x9c,
+ 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x26, 0xc9, 0xfd,
+ 0x5c, 0x15, 0xee, 0x53, 0x45, 0x5b, 0x3f, 0x9c,
+ 0xed, 0x2f, 0xf4, 0x71, 0xd3, 0xd9, 0x6e, 0xb9,
+ 0xd2, 0xd5, 0x70, 0xf5, 0x3e, 0x69, 0x3e, 0x15,
+ 0xee, 0x53, 0x45, 0x69, 0x3f, 0xfc, 0xa8, 0x38,
+ 0x0e, 0x67, 0x39, 0x3c, 0xa7, 0x4f, 0xff, 0x3a,
+ 0x99, 0xf4, 0x67, 0x65, 0xee, 0x8c, 0x3a, 0x6b,
+ 0xdd, 0x11, 0x2f, 0xc9, 0x53, 0xf9, 0x1b, 0x6f,
+ 0xbf, 0xd0, 0x07, 0x4f, 0xcf, 0x65, 0xbd, 0x8c,
+ 0x3a, 0x7f, 0xb3, 0x53, 0xe8, 0x17, 0xdd, 0x43,
+ 0xa7, 0xf3, 0xb2, 0xfd, 0xf0, 0x68, 0x74, 0xaa,
+ 0xdc, 0x4f, 0xcb, 0x0b, 0x3d, 0x0c, 0x7b, 0x16,
+ 0xf1, 0xb7, 0xcb, 0x6e, 0x79, 0x3f, 0xab, 0x82,
+ 0xbd, 0xca, 0x68, 0xb0, 0x27, 0xc2, 0xbd, 0xca,
+ 0x68, 0x9d, 0x67, 0xff, 0xf5, 0x91, 0xed, 0xb1,
+ 0x95, 0xa5, 0x32, 0xde, 0xa6, 0x8f, 0x1d, 0x3e,
+ 0xab, 0x39, 0xd5, 0xc4, 0x4a, 0xb4, 0x61, 0x3e,
+ 0x15, 0xee, 0x53, 0x45, 0xb3, 0x3f, 0xe0, 0x25,
+ 0x2b, 0x6f, 0x2f, 0x09, 0xd2, 0xae, 0x1f, 0x67,
+ 0x18, 0x4f, 0x2f, 0x72, 0x9a, 0x2e, 0x69, 0x30,
+ 0xe9, 0xab, 0x82, 0x6e, 0xc2, 0x57, 0x3f, 0xab,
+ 0x82, 0xbd, 0xca, 0x68, 0xbb, 0xe7, 0xab, 0xaf,
+ 0x60, 0x1d, 0x08, 0xd9, 0xc0, 0x65, 0x36, 0x8d,
+ 0x4c, 0x1f, 0x52, 0xf4, 0xa8, 0x11, 0x72, 0x64,
+ 0x34, 0x01, 0x0a, 0xca, 0x30, 0xdc, 0xaf, 0x79,
+ 0xdc, 0xfe, 0xfb, 0xd9, 0xa9, 0x74, 0xd6, 0x74,
+ 0xf8, 0x57, 0xb9, 0x4d, 0x12, 0xbc, 0xf6, 0x9c,
+ 0x2e, 0x3a, 0x7f, 0xff, 0x7a, 0xfc, 0xce, 0xf8,
+ 0x2c, 0x1e, 0xfb, 0xcb, 0xe7, 0x8e, 0x95, 0xb6,
+ 0x44, 0x1f, 0x10, 0xce, 0xe7, 0x55, 0x13, 0x14,
+ 0xc3, 0x8a, 0x42, 0xce, 0x75, 0xd3, 0x62, 0xa7,
+ 0xff, 0x5b, 0xbd, 0x74, 0x77, 0x85, 0xed, 0x00,
+ 0x54, 0xfe, 0xe5, 0xae, 0xc2, 0xdd, 0xd5, 0x0f,
+ 0x9e, 0x83, 0x92, 0xab, 0x11, 0xf4, 0xda, 0x15,
+ 0x93, 0xff, 0xaa, 0xce, 0x75, 0x70, 0x57, 0xb9,
+ 0x4d, 0x13, 0x0c, 0xff, 0xfd, 0x95, 0xde, 0x3c,
+ 0x0a, 0xeb, 0xbb, 0x82, 0x94, 0x71, 0xd3, 0xff,
+ 0x6a, 0xb8, 0xfb, 0xb4, 0xeb, 0xfd, 0x1c, 0x74,
+ 0xff, 0x7d, 0x39, 0xeb, 0xeb, 0xe1, 0x3a, 0x7e,
+ 0x62, 0x67, 0xee, 0xde, 0x74, 0xf9, 0x33, 0xf7,
+ 0x6f, 0x3a, 0x7e, 0xb7, 0xaf, 0x4e, 0x7f, 0x71,
+ 0xec, 0x30, 0xbe, 0x7f, 0xff, 0xdf, 0xc0, 0xea,
+ 0x5f, 0x2d, 0xbb, 0xf8, 0xf7, 0xb3, 0xef, 0xba,
+ 0x87, 0x4f, 0xcd, 0xb7, 0xdf, 0xe8, 0x03, 0xa7,
+ 0xff, 0x25, 0xc0, 0x8e, 0xc7, 0xee, 0xf6, 0x81,
+ 0x3a, 0x10, 0xff, 0x7c, 0x63, 0x3f, 0x53, 0xda,
+ 0xd9, 0xd7, 0x3a, 0x7f, 0xff, 0xc3, 0x8d, 0x93,
+ 0xf7, 0xdd, 0xbf, 0xe9, 0x6e, 0xf5, 0xd2, 0xf4,
+ 0x3a, 0x58, 0xfa, 0x27, 0xc4, 0xbe, 0x7b, 0xb7,
+ 0xed, 0x87, 0x4a, 0xad, 0xc5, 0x63, 0xdb, 0x25,
+ 0x2c, 0x24, 0x5a, 0x48, 0xb4, 0x3c, 0x3f, 0x0c,
+ 0x0d, 0x0a, 0x27, 0xc2, 0xbd, 0xca, 0x68, 0xab,
+ 0xa7, 0xf9, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x47,
+ 0x92, 0xae, 0x1f, 0x8f, 0x18, 0x4f, 0xea, 0xe0,
+ 0xaf, 0x72, 0x9a, 0x2c, 0x19, 0xfd, 0x5c, 0x15,
+ 0xee, 0x53, 0x45, 0x95, 0x3f, 0xab, 0x82, 0xbd,
+ 0xca, 0x68, 0xb4, 0xe7, 0x97, 0xb9, 0x4d, 0x16,
+ 0xe4, 0xff, 0xc9, 0x83, 0x9f, 0xdd, 0x6c, 0x7c,
+ 0x27, 0x40, 0x9f, 0x7d, 0x0a, 0xe7, 0xfd, 0xce,
+ 0xae, 0x0a, 0xf7, 0x29, 0xa2, 0x87, 0x9f, 0xbe,
+ 0xdc, 0xc1, 0x4a, 0x1d, 0x3f, 0xff, 0x66, 0xd6,
+ 0x4d, 0xf5, 0xbf, 0xf8, 0x14, 0xa2, 0x00, 0xa9,
+ 0x57, 0x11, 0xe6, 0xc2, 0x1d, 0x11, 0x9b, 0xcb,
+ 0xe7, 0xf5, 0x70, 0x57, 0xb9, 0x4d, 0x17, 0x9c,
+ 0x22, 0xfd, 0x53, 0x8c, 0x36, 0x52, 0xc9, 0x6f,
+ 0x8f, 0xc3, 0xc8, 0x49, 0x98, 0x77, 0x63, 0xbf,
+ 0xc7, 0x3a, 0xd9, 0x1a, 0x7f, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x4b, 0x4f, 0xea, 0xe0, 0xaf, 0x72,
+ 0x9a, 0x2c, 0x29, 0xfd, 0x5c, 0x15, 0xee, 0x53,
+ 0x45, 0x97, 0x3f, 0xfa, 0xac, 0xe7, 0x57, 0x05,
+ 0x7b, 0x94, 0xd1, 0x46, 0x4f, 0xea, 0xa3, 0x64,
+ 0x14, 0x01, 0xd0, 0xe4, 0xcd, 0x44, 0xed, 0x87,
+ 0x74, 0x3b, 0xba, 0x94, 0xff, 0xd5, 0xe7, 0x57,
+ 0x05, 0x7b, 0x94, 0xd1, 0x1c, 0xcf, 0xfe, 0xab,
+ 0x39, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x4e, 0x53,
+ 0xfa, 0xb8, 0x2b, 0xdc, 0xa6, 0x8b, 0x32, 0x7f,
+ 0x57, 0x05, 0x7b, 0x94, 0xd1, 0x6e, 0xcf, 0xfe,
+ 0xab, 0x39, 0xd5, 0xc1, 0x5e, 0xe5, 0x34, 0x52,
+ 0x13, 0xff, 0x57, 0x9d, 0x5c, 0x15, 0xee, 0x53,
+ 0x44, 0xa5, 0x0f, 0x27, 0x64, 0xd2, 0x63, 0x14,
+ 0xbe, 0x77, 0x73, 0xbd, 0x45, 0x29, 0xff, 0x73,
+ 0xab, 0x82, 0xbd, 0xca, 0x68, 0x9d, 0xa7, 0xff,
+ 0xde, 0xdb, 0x46, 0x26, 0xa7, 0x6d, 0xf4, 0xfe,
+ 0x29, 0xd3, 0x32, 0xac, 0x44, 0xff, 0x23, 0x4f,
+ 0x85, 0x7b, 0x94, 0xd1, 0x16, 0x4f, 0xfb, 0x9d,
+ 0x5c, 0x15, 0xee, 0x53, 0x44, 0xbb, 0x3f, 0xff,
+ 0x66, 0xd6, 0x4d, 0xf5, 0xbf, 0xf8, 0x14, 0xa2,
+ 0x00, 0xa9, 0x57, 0x11, 0xa6, 0xc3, 0x06, 0xf4,
+ 0x69, 0xff, 0xd5, 0x67, 0x3a, 0xb8, 0x2b, 0xdc,
+ 0xa6, 0x89, 0x8a, 0x7f, 0x57, 0x05, 0x7b, 0x94,
+ 0xd1, 0x54, 0xcf, 0xfe, 0xab, 0x39, 0xd5, 0xc1,
+ 0x5e, 0xe5, 0x34, 0x4e, 0x93, 0xfb, 0xdc, 0x28,
+ 0xee, 0x6c, 0x74, 0xf9, 0xa4, 0x69, 0x28, 0x74,
+ 0xfc, 0x1c, 0xf3, 0x6c, 0xf9, 0xd3, 0xde, 0xb2,
+ 0x57, 0xc7, 0xad, 0x42, 0x89, 0xff, 0xb4, 0xa5,
+ 0xd1, 0xfa, 0xe8, 0xd7, 0x98, 0x74, 0x31, 0x10,
+ 0x56, 0x39, 0x9f, 0xf7, 0x3a, 0xb8, 0x2b, 0xdc,
+ 0xa6, 0x89, 0xde, 0x7d, 0x7d, 0x39, 0x9e, 0x2a,
+ 0x55, 0xd9, 0x39, 0xbc, 0x8c, 0x29, 0x84, 0x7c,
+ 0x8d, 0x3f, 0xfa, 0xac, 0xe7, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x42, 0xcf, 0xfe, 0xab, 0x39, 0xd5,
+ 0xc1, 0x5e, 0xe5, 0x34, 0x52, 0x53, 0xff, 0xfb,
+ 0x29, 0x5d, 0xf8, 0xd5, 0xb9, 0x97, 0xb2, 0x5f,
+ 0x46, 0x1d, 0x0f, 0x2e, 0x01, 0xb8, 0xe1, 0x54,
+ 0x84, 0xed, 0x91, 0xf6, 0x81, 0x27, 0x45, 0x26,
+ 0xf5, 0x29, 0xfd, 0x5c, 0x15, 0xee, 0x53, 0x44,
+ 0x49, 0x3f, 0xfa, 0xac, 0xe7, 0x57, 0x05, 0x7b,
+ 0x94, 0xd1, 0x2f, 0x4f, 0x85, 0x7b, 0x94, 0xd1,
+ 0x4b, 0xcf, 0xe4, 0xdb, 0x53, 0xcc, 0x4a, 0x1d,
+ 0x2a, 0xe1, 0xf3, 0x5c, 0xc2, 0x7f, 0x57, 0x05,
+ 0x7b, 0x94, 0xd1, 0x4e, 0x4f, 0xfb, 0xc3, 0xd4,
+ 0xb6, 0x67, 0xd4, 0xe9, 0xff, 0x65, 0x90, 0x72,
+ 0xa1, 0x08, 0x4a, 0x9b, 0xc1, 0x3a, 0x67, 0xab,
+ 0xb2, 0x23, 0x5b, 0xce, 0xf5, 0x0f, 0x27, 0xc2,
+ 0xbd, 0xca, 0x68, 0xaf, 0x27, 0xff, 0xec, 0xda,
+ 0xc9, 0xbe, 0xb7, 0xff, 0x02, 0x94, 0x40, 0x15,
+ 0x2a, 0xe2, 0x23, 0x5b, 0xcc, 0x27, 0xfe, 0xaf,
+ 0x3a, 0xb8, 0x2b, 0xdc, 0xa6, 0x89, 0x1e, 0x77,
+ 0x80, 0x87, 0x4e, 0x5c, 0x61, 0x55, 0x2e, 0xe7,
+ 0xc2, 0xbd, 0xca, 0x68, 0x92, 0x27, 0xab, 0xce,
+ 0xaa, 0x1e, 0xce, 0x14, 0xcf, 0xfd, 0x5e, 0x75,
+ 0x70, 0x57, 0xb9, 0x4d, 0x12, 0x54, 0xf8, 0x57,
+ 0xb9, 0x4d, 0x17, 0x8c, 0xfd, 0xa7, 0xdf, 0xe7,
+ 0xe8, 0x74, 0xfa, 0x94, 0xbe, 0x29, 0xd3, 0xfc,
+ 0xea, 0xe0, 0xaf, 0x72, 0x9a, 0x24, 0xd9, 0x57,
+ 0x11, 0x8e, 0xf9, 0x80, 0x98, 0x71, 0x34, 0x22,
+ 0xe9, 0x4b, 0xc7, 0x6e, 0x85, 0xc6, 0xc4, 0xfe,
+ 0x86, 0x43, 0x50, 0xd1, 0x61, 0x5d, 0xa1, 0x81,
+ 0x73, 0x7d, 0x23, 0x13, 0x84, 0x8d, 0x4e, 0xad,
+ 0xe8, 0xeb, 0x9d, 0x1e, 0x4e, 0xd1, 0xed, 0x65,
+ 0xb7, 0x61, 0xd7, 0x29, 0x59, 0x6b, 0xdb, 0x37,
+ 0xe7, 0x9e, 0xfd, 0x39, 0x89, 0xab, 0x8e, 0xc1,
+ 0xaa, 0x5a, 0xb0, 0xcf, 0xf1, 0xb2, 0xff, 0x78,
+ 0x2d, 0x3b, 0x4d, 0xd4, 0xe0, 0x90, 0x4b, 0x0e,
+ 0x6e, 0xe1, 0x63, 0xf9, 0xe0, 0x2a, 0x52, 0x37,
+ 0xef, 0x5c, 0x04, 0x69, 0x4a, 0x6e, 0x6d, 0x1e,
+ 0xb0, 0x63, 0xfc, 0x6f, 0x87, 0xe6, 0xf9, 0xd0,
+ 0x4d, 0x49, 0xda, 0x68,
};
-static const unsigned kPreloadedHSTSBits = 86044;
+static const unsigned kPreloadedHSTSBits = 88863;
-static const unsigned kHSTSRootPosition = 85472;
+static const unsigned kHSTSRootPosition = 88291;
#endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 282cd58..6a8d5e3 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1347,7 +1347,41 @@
{ "name": "zh.search.yahoo.com", "include_subdomains": false, "mode": "force-https" },
{ "name": "login.yahoo.com", "include_subdomains": true, "mode": "force-https" },
{ "name": "mail.yahoo.com", "include_subdomains": false, "mode": "force-https" },
- { "name": "edit.yahoo.com", "include_subdomains": true, "mode": "force-https" }
+ { "name": "edit.yahoo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ahoyconference.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "balcan-underground.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "baldwinkoo.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bigbrownpromotions.com.au", "include_subdomains": true, "mode": "force-https" },
+ { "name": "bodo-wolff.de", "include_subdomains": true, "mode": "force-https" },
+ { "name": "calibreapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "call.me", "include_subdomains": true, "mode": "force-https" },
+ { "name": "chrisjean.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "cujanovic.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "deadbeef.ninja", "include_subdomains": true, "mode": "force-https" },
+ { "name": "esec.rs", "include_subdomains": true, "mode": "force-https" },
+ { "name": "floobits.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "freenetproject.org", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fundingempire.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "heid.ws", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ironfistdesign.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "kinogb.net", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ljs.io", "include_subdomains": true, "mode": "force-https" },
+ { "name": "lovelycorral.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "megashur.se", "include_subdomains": true, "mode": "force-https" },
+ { "name": "minnesotadata.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "mountainmusicpromotions.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "newstarnootropics.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "onedot.nl", "include_subdomains": true, "mode": "force-https" },
+ { "name": "powerplannerapp.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "ru-sprachstudio.ch", "include_subdomains": true, "mode": "force-https" },
+ { "name": "segu-info.com.ar", "include_subdomains": true, "mode": "force-https" },
+ { "name": "slattery.co", "include_subdomains": true, "mode": "force-https" },
+ { "name": "slidebatch.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "smartship.co.jp", "include_subdomains": true, "mode": "force-https" },
+ { "name": "southside-crew.com", "include_subdomains": true, "mode": "force-https" },
+ { "name": "tickopa.co.uk", "include_subdomains": true, "mode": "force-https" },
+ { "name": "wieninternational.at", "include_subdomains": true, "mode": "force-https" },
+ { "name": "fleximus.org", "include_subdomains": true, "mode": "force-https" }
],
// |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/proxy/proxy_config_service_win.cc b/net/proxy/proxy_config_service_win.cc
index 32553db..dba1d9b 100644
--- a/net/proxy/proxy_config_service_win.cc
+++ b/net/proxy/proxy_config_service_win.cc
@@ -7,6 +7,8 @@
#include <windows.h>
#include <winhttp.h>
+#include "base/bind.h"
+#include "base/bind_helpers.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/profiler/scoped_profile.h"
@@ -16,6 +18,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_restrictions.h"
#include "base/win/registry.h"
+#include "base/win/scoped_handle.h"
#include "net/base/net_errors.h"
#include "net/proxy/proxy_config.h"
@@ -38,36 +41,6 @@
} // namespace
-// RegKey and ObjectWatcher pair.
-class ProxyConfigServiceWin::KeyEntry {
- public:
- bool StartWatching(base::win::ObjectWatcher::Delegate* delegate) {
- // Try to create a watch event for the registry key (which watches the
- // sibling tree as well).
- if (key_.StartWatching() != ERROR_SUCCESS)
- return false;
-
- // Now setup an ObjectWatcher for this event, so we get OnObjectSignaled()
- // invoked on this message loop once it is signalled.
- if (!watcher_.StartWatching(key_.watch_event(), delegate))
- return false;
-
- return true;
- }
-
- bool CreateRegKey(HKEY rootkey, const wchar_t* subkey) {
- return key_.Create(rootkey, subkey, KEY_NOTIFY) == ERROR_SUCCESS;
- }
-
- HANDLE watch_event() const {
- return key_.watch_event();
- }
-
- private:
- base::win::RegKey key_;
- base::win::ObjectWatcher watcher_;
-};
-
ProxyConfigServiceWin::ProxyConfigServiceWin()
: PollingProxyConfigService(
base::TimeDelta::FromSeconds(kPollIntervalSec),
@@ -125,35 +98,38 @@
bool ProxyConfigServiceWin::AddKeyToWatchList(HKEY rootkey,
const wchar_t* subkey) {
- scoped_ptr<KeyEntry> entry(new KeyEntry);
- if (!entry->CreateRegKey(rootkey, subkey))
+ scoped_ptr<base::win::RegKey> key(new base::win::RegKey);
+ if (key->Create(rootkey, subkey, KEY_NOTIFY) != ERROR_SUCCESS)
return false;
- if (!entry->StartWatching(this))
+ if (!key->StartWatching(base::Bind(&ProxyConfigServiceWin::OnObjectSignaled,
+ base::Unretained(this),
+ base::Unretained(key.get())))) {
return false;
+ }
- keys_to_watch_.push_back(entry.release());
+ keys_to_watch_.push_back(key.release());
return true;
}
-void ProxyConfigServiceWin::OnObjectSignaled(HANDLE object) {
+void ProxyConfigServiceWin::OnObjectSignaled(base::win::RegKey* key) {
// TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
tracked_objects::ScopedProfile tracking_profile(
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"ProxyConfigServiceWin_OnObjectSignaled"));
// Figure out which registry key signalled this change.
- KeyEntryList::iterator it;
- for (it = keys_to_watch_.begin(); it != keys_to_watch_.end(); ++it) {
- if ((*it)->watch_event() == object)
- break;
- }
-
+ RegKeyList::iterator it =
+ std::find(keys_to_watch_.begin(), keys_to_watch_.end(), key);
DCHECK(it != keys_to_watch_.end());
// Keep watching the registry key.
- if (!(*it)->StartWatching(this))
+ if (!key->StartWatching(base::Bind(&ProxyConfigServiceWin::OnObjectSignaled,
+ base::Unretained(this),
+ base::Unretained(key)))) {
+ delete *it;
keys_to_watch_.erase(it);
+ }
// Have the PollingProxyConfigService test for changes.
CheckForChangesNow();
diff --git a/net/proxy/proxy_config_service_win.h b/net/proxy/proxy_config_service_win.h
index 62f1f12..52c3895 100644
--- a/net/proxy/proxy_config_service_win.h
+++ b/net/proxy/proxy_config_service_win.h
@@ -12,9 +12,14 @@
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
-#include "base/win/object_watcher.h"
#include "net/proxy/polling_proxy_config_service.h"
+namespace base {
+namespace win {
+class RegKey;
+}
+} // namespace base.
+
namespace net {
// Implementation of ProxyConfigService that retrieves the system proxy
@@ -40,8 +45,7 @@
// change, or in case we got it wrong (and are not checking all possible
// registry dependencies).
class NET_EXPORT_PRIVATE ProxyConfigServiceWin
- : public PollingProxyConfigService,
- public base::win::ObjectWatcher::Delegate {
+ : public PollingProxyConfigService {
public:
ProxyConfigServiceWin();
virtual ~ProxyConfigServiceWin();
@@ -51,19 +55,17 @@
private:
FRIEND_TEST_ALL_PREFIXES(ProxyConfigServiceWinTest, SetFromIEConfig);
- class KeyEntry;
- typedef std::vector<KeyEntry*> KeyEntryList;
+ typedef std::vector<base::win::RegKey*> RegKeyList;
// Registers change observers on the registry keys relating to proxy settings.
void StartWatchingRegistryForChanges();
- // Creates a new KeyEntry and appends it to |keys_to_watch_|. If the key
- // fails to be created, it is not appended to the list and we return false.
+ // Creates a new key and appends it to |keys_to_watch_|. If the key fails to
+ // be created, it is not appended to the list and we return false.
bool AddKeyToWatchList(HKEY rootkey, const wchar_t* subkey);
- // ObjectWatcher::Delegate methods:
// This is called whenever one of the registry keys we are watching change.
- virtual void OnObjectSignaled(HANDLE object) override;
+ void OnObjectSignaled(base::win::RegKey* key);
static void GetCurrentProxyConfig(ProxyConfig* config);
@@ -72,7 +74,7 @@
ProxyConfig* config,
const WINHTTP_CURRENT_USER_IE_PROXY_CONFIG& ie_config);
- KeyEntryList keys_to_watch_;
+ RegKeyList keys_to_watch_;
};
} // namespace net
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index 92660d8..7366c16 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -1689,6 +1689,11 @@
}
int SSLClientSocketNSS::Core::DoHandshakeLoop(int last_io_result) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424386 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "424386 SSLClientSocketNSS::Core::DoHandshakeLoop"));
+
DCHECK(OnNSSTaskRunner());
int rv = last_io_result;
@@ -1725,6 +1730,11 @@
}
int SSLClientSocketNSS::Core::DoReadLoop(int result) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424386 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "424386 SSLClientSocketNSS::Core::DoReadLoop"));
+
DCHECK(OnNSSTaskRunner());
DCHECK(false_started_ || handshake_callback_called_);
DCHECK_EQ(STATE_NONE, next_handshake_state_);
@@ -2195,6 +2205,11 @@
// callback. For Read() and Write(), that's what we want. But for Connect(),
// the caller expects OK (i.e. 0) for success.
void SSLClientSocketNSS::Core::DoConnectCallback(int rv) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424386 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "424386 SSLClientSocketNSS::Core::DoConnectCallback"));
+
DCHECK(OnNSSTaskRunner());
DCHECK_NE(rv, ERR_IO_PENDING);
DCHECK(!user_connect_callback_.is_null());
@@ -2206,6 +2221,11 @@
}
void SSLClientSocketNSS::Core::DoReadCallback(int rv) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/424386 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "424386 SSLClientSocketNSS::Core::DoReadCallback"));
+
DCHECK(OnNSSTaskRunner());
DCHECK_NE(ERR_IO_PENDING, rv);
DCHECK(!user_read_callback_.is_null());
@@ -2222,7 +2242,7 @@
FROM_HERE,
base::Bind(&Core::DidNSSRead, this, rv));
// TODO(vadimt): Remove ScopedProfile below once crbug.com/418183 is fixed.
- tracked_objects::ScopedProfile tracking_profile(
+ tracked_objects::ScopedProfile tracking_profile1(
FROM_HERE_WITH_EXPLICIT_FUNCTION(
"SSLClientSocketNSS::Core::DoReadCallback"));
PostOrRunCallback(
diff --git a/net/socket/ssl_session_cache_openssl.cc b/net/socket/ssl_session_cache_openssl.cc
index 8aaa9a0..65b5aaf 100644
--- a/net/socket/ssl_session_cache_openssl.cc
+++ b/net/socket/ssl_session_cache_openssl.cc
@@ -87,8 +87,9 @@
// this one is just simple enough to do the job.
size_t ComputeHash(const unsigned char* id, unsigned id_len) {
size_t result = 0;
- for (unsigned n = 0; n < id_len; ++n)
- result += 131 * id[n];
+ for (unsigned n = 0; n < id_len; ++n) {
+ result = (result * 131) + id[n];
+ }
return result;
}
};
diff --git a/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java b/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
index 270b821..66a9bd9 100644
--- a/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
+++ b/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
@@ -72,6 +72,7 @@
private final ServerThread mServerThread;
private String mServerUri;
private final boolean mSsl;
+ private final int mPort;
private static class Response {
final byte[] mResponseData;
@@ -100,10 +101,13 @@
/**
* Create and start a local HTTP server instance.
+ * @param port Port number the server must use, or 0 to automatically choose a free port.
* @param ssl True if the server should be using secure sockets.
* @throws Exception
*/
- private TestWebServer(boolean ssl) throws Exception {
+ private TestWebServer(int port, boolean ssl) throws Exception {
+ mPort = port;
+
mSsl = ssl;
if (mSsl) {
mServerUri = "https:";
@@ -117,32 +121,40 @@
}
}
- mServerThread = new ServerThread(this, mSsl);
+ mServerThread = new ServerThread(this, mPort, mSsl);
mServerUri += "//localhost:" + mServerThread.mSocket.getLocalPort();
}
- public static TestWebServer start() throws Exception {
+ public static TestWebServer start(int port) throws Exception {
if (sInstance != null) {
throw new IllegalStateException("Tried to start multiple TestWebServers");
}
- TestWebServer server = new TestWebServer(false);
+ TestWebServer server = new TestWebServer(port, false);
server.mServerThread.start();
setInstance(server);
return server;
}
- public static TestWebServer startSsl() throws Exception {
+ public static TestWebServer start() throws Exception {
+ return start(0);
+ }
+
+ public static TestWebServer startSsl(int port) throws Exception {
if (sSecureInstance != null) {
throw new IllegalStateException("Tried to start multiple SSL TestWebServers");
}
- TestWebServer server = new TestWebServer(true);
+ TestWebServer server = new TestWebServer(port, true);
server.mServerThread.start();
setSecureInstance(server);
return server;
}
+ public static TestWebServer startSsl() throws Exception {
+ return startSsl(0);
+ }
+
/**
* Terminate the http server.
*/
@@ -569,7 +581,7 @@
}
- public ServerThread(TestWebServer server, boolean ssl) throws Exception {
+ public ServerThread(TestWebServer server, int port, boolean ssl) throws Exception {
super("ServerThread");
mServer = server;
mIsSsl = ssl;
@@ -579,9 +591,9 @@
if (mIsSsl) {
mSslContext = SSLContext.getInstance("TLS");
mSslContext.init(getKeyManagers(), null, null);
- mSocket = mSslContext.getServerSocketFactory().createServerSocket(0);
+ mSocket = mSslContext.getServerSocketFactory().createServerSocket(port);
} else {
- mSocket = new ServerSocket(0);
+ mSocket = new ServerSocket(port);
}
return;
} catch (IOException e) {
diff --git a/net/url_request/url_request_data_job.cc b/net/url_request/url_request_data_job.cc
index e074646..db4367f 100644
--- a/net/url_request/url_request_data_job.cc
+++ b/net/url_request/url_request_data_job.cc
@@ -6,6 +6,7 @@
#include "net/url_request/url_request_data_job.h"
+#include "base/profiler/scoped_profile.h"
#include "net/base/data_url.h"
#include "net/base/net_errors.h"
#include "net/http/http_response_headers.h"
@@ -52,6 +53,10 @@
std::string* charset,
std::string* data,
const CompletionCallback& callback) const {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/422489 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION("422489 URLRequestDataJob::GetData"));
+
// Check if data URL is valid. If not, don't bother to try to extract data.
// Otherwise, parse the data from the data URL.
const GURL& url = request_->url();
diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc
index a02da27..a124864 100644
--- a/net/url_request/url_request_simple_job.cc
+++ b/net/url_request/url_request_simple_job.cc
@@ -100,6 +100,11 @@
}
void URLRequestSimpleJob::OnGetDataCompleted(int result) {
+ // TODO(vadimt): Remove ScopedProfile below once crbug.com/422489 is fixed.
+ tracked_objects::ScopedProfile tracking_profile(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "422489 URLRequestSimpleJob::OnGetDataCompleted"));
+
if (result == OK) {
// Notify that the headers are complete
if (!byte_range_.ComputeBounds(data_.size())) {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index cb1a8e5..a0187b9 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -303,13 +303,13 @@
"Site Isolation Linux": {
"gtest_tests": [
{ "test": "content_unittests", "args": ["--site-per-process"] },
- { "test": "content_browsertests", "args": ["--site-per-process --gtest_filter=-RenderFrameHostManagerTest.AllowTargetedNavigationsAfterSwap:-RenderFrameHostManagerTest.SupportCrossProcessPostMessage:-SiteIsolationPolicyBrowserTest.CrossSiteDocumentBlockingForDifferentTargets:-RenderFrameHostManagerTest.DontSwapProcessWithOnlyTargetBlank:-RenderFrameHostManagerTest.DisownOpener:-FrameTreeBrowserTest.NavigateWithLeftoverFrames:-RenderFrameHostManagerTest.DontPreemptNavigationWithFrameTreeUpdate:-RenderFrameHostManagerTest.ProcessExitWithSwappedOutViews:-RenderFrameHostManagerTest.SupportCrossProcessPostMessageWithMessagePort:-RenderFrameHostManagerTest.AllowTargetedNavigationsInOpenerAfterSwap"] }
+ { "test": "content_browsertests", "args": ["--site-per-process", "--gtest_filter=-*.AllowTargetedNavigationsAfterSwap:*.SupportCrossProcessPostMessage:*.DontSwapProcessWithOnlyTargetBlank:*.DisownOpener:*.NavigateWithLeftoverFrames:*.DontPreemptNavigationWithFrameTreeUpdate:*.ProcessExitWithSwappedOutViews:*.SupportCrossProcessPostMessageWithMessagePort:*.AllowTargetedNavigationsInOpenerAfterSwap"] }
]
},
"Site Isolation Win": {
"gtest_tests": [
{ "test": "content_unittests", "args": ["--site-per-process"] },
- { "test": "content_browsertests", "args": ["--site-per-process --gtest_filter=-RenderFrameHostManagerTest.AllowTargetedNavigationsAfterSwap:-RenderFrameHostManagerTest.SupportCrossProcessPostMessage:-SiteIsolationPolicyBrowserTest.CrossSiteDocumentBlockingForDifferentTargets:-RenderFrameHostManagerTest.DontSwapProcessWithOnlyTargetBlank:-RenderFrameHostManagerTest.DisownOpener:-FrameTreeBrowserTest.NavigateWithLeftoverFrames:-RenderFrameHostManagerTest.DontPreemptNavigationWithFrameTreeUpdate:-RenderFrameHostManagerTest.ProcessExitWithSwappedOutViews:-RenderFrameHostManagerTest.SupportCrossProcessPostMessageWithMessagePort:-RenderFrameHostManagerTest.AllowTargetedNavigationsInOpenerAfterSwap"] }
+ { "test": "content_browsertests", "args": ["--site-per-process", "--gtest_filter=-*.AllowTargetedNavigationsAfterSwap:*.SupportCrossProcessPostMessage:*.DontSwapProcessWithOnlyTargetBlank:*.DisownOpener:*.NavigateWithLeftoverFrames:*.DontPreemptNavigationWithFrameTreeUpdate:*.ProcessExitWithSwappedOutViews:*.SupportCrossProcessPostMessageWithMessagePort:*.AllowTargetedNavigationsInOpenerAfterSwap"] }
]
},
"Linux ChromeOS MSan Tests": {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index 20fb969..26c913e 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -95,53 +95,61 @@
},
"Vista Tests (1)": {
"gtest_tests": [
- "interactive_ui_tests",
+ "accessibility_unittests",
+ "app_shell_unittests",
+ "ash_unittests",
+ "aura_unittests",
+ {
+ "test": "base_unittests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
+ {
+ "test": "browser_tests",
+ "swarming": {
+ "can_use_on_swarming_builders": true,
+ "shards": 7
+ }
+ },
"cacheinvalidation_unittests",
"cast_unittests",
"cc_unittests",
"chromedriver_unittests",
- "courgette_unittests",
- "crypto_unittests",
- "gfx_unittests",
- "gpu_unittests",
- "url_unittests",
- "jingle_unittests",
- "media_unittests",
- "ppapi_unittests",
- "printing_unittests",
- "remoting_unittests",
- "sbox_unittests",
- "sbox_integration_tests",
- "sbox_validation_tests",
- {"test": "browser_tests", "shard_index": 0, "total_shards": 3},
- "content_browsertests",
- "installer_util_unittests"
- ]
- },
- "Vista Tests (2)": {
- "gtest_tests": [
- "accessibility_unittests",
- "base_unittests",
- "net_unittests",
- "views_unittests",
- "wm_unittests",
- "aura_unittests",
- "ash_unittests",
- "compositor_unittests",
- "events_unittests",
- "sync_integration_tests",
- {"test": "browser_tests", "shard_index": 1, "total_shards": 3}
- ]
- },
- "Vista Tests (3)": {
- "gtest_tests": [
- "app_shell_unittests",
"chrome_elf_unittests",
"components_unittests",
+ "compositor_unittests",
+ {
+ "test": "content_browsertests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
+ {
+ "test": "content_unittests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
+ "courgette_unittests",
+ "crypto_unittests",
"extensions_unittests",
+ "events_unittests",
"gcm_unit_tests",
+ "gfx_unittests",
"google_apis_unittests",
+ "gpu_unittests",
+ "installer_util_unittests",
+ {
+ "test": "interactive_ui_tests",
+ "swarming": {
+ "can_use_on_swarming_builders": true,
+ "shards": 2
+ }
+ },
"ipc_tests",
+ "jingle_unittests",
+ "media_unittests",
"mojo_apps_js_unittests",
"mojo_common_unittests",
"mojo_js_unittests",
@@ -150,12 +158,44 @@
"mojo_public_system_unittests",
"mojo_public_utility_unittests",
"mojo_system_unittests",
- "sync_unit_tests",
- "unit_tests",
+ {
+ "test": "net_unittests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
+ "ppapi_unittests",
+ "printing_unittests",
+ "remoting_unittests",
+ "sbox_unittests",
+ "sbox_integration_tests",
+ "sbox_validation_tests",
"sql_unittests",
+ {
+ "test": "sync_integration_tests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
+ "sync_unit_tests",
+ {
+ "test": "unit_tests",
+ "swarming": {
+ "can_use_on_swarming_builders": true
+ }
+ },
"ui_unittests",
- "content_unittests",
- {"test": "browser_tests", "shard_index": 2, "total_shards": 3}
+ "url_unittests",
+ "views_unittests",
+ "wm_unittests"
+ ]
+ },
+ "Vista Tests (2)": {
+ "gtest_tests": [
+ ]
+ },
+ "Vista Tests (3)": {
+ "gtest_tests": [
]
},
"Win7 Tests (1)": {
diff --git a/testing/chromoting/browser_test_commands_linux.txt b/testing/chromoting/browser_test_commands_linux.txt
new file mode 100644
index 0000000..3b1be77
--- /dev/null
+++ b/testing/chromoting/browser_test_commands_linux.txt
@@ -0,0 +1 @@
+/usr/bin/python ../xvfb.py $(PROD_DIR) $(PROD_DIR)/browser_tests --gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch --run-manual --ui-test-action-timeout=100000 --webapp-unpacked=$(PROD_DIR)/remoting/remoting.webapp --extension-name=Chromoting
\ No newline at end of file
diff --git a/testing/chromoting/browser_tests_launcher.py b/testing/chromoting/browser_tests_launcher.py
new file mode 100644
index 0000000..66b54fe
--- /dev/null
+++ b/testing/chromoting/browser_tests_launcher.py
@@ -0,0 +1,45 @@
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+"""Utility script to launch browser-tests on the Chromoting bot."""
+import argparse
+import subprocess
+
+PROD_DIR_ID = '$(PROD_DIR)'
+
+
+def LaunchCommand(command):
+
+ cmd_line = [command]
+ try:
+ results = subprocess.check_output(
+ cmd_line, stderr=subprocess.STDOUT, shell=True)
+ except subprocess.CalledProcessError, e:
+ raise Exception('Exception %s running command %s' % (e, command))
+ else:
+ print results
+ finally:
+ pass
+
+
+def main():
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-f', '--file',
+ help='path to file listing commands to be launched.')
+ parser.add_argument('-p', '--prod_dir',
+ help='path to folder having product and test binaries.')
+
+ args = parser.parse_args()
+
+ with open(args.file) as f:
+ for line in f:
+ # Replace the PROD_DIR value in the command-line with
+ # the passed in value.
+ line = line.replace(PROD_DIR_ID, args.prod_dir)
+ LaunchCommand(line)
+
+if __name__ == '__main__':
+ main()
diff --git a/testing/chromoting/chromoting_integration_tests.isolate b/testing/chromoting/chromoting_integration_tests.isolate
index 4b45213..135836b 100644
--- a/testing/chromoting/chromoting_integration_tests.isolate
+++ b/testing/chromoting/chromoting_integration_tests.isolate
@@ -6,17 +6,17 @@
['OS=="linux"', {
'variables': {
'command': [
- '../xvfb.py',
+ './browser_tests_launcher.py',
+ '-f',
+ './browser_test_commands_linux.txt',
+ '-p',
'<(PRODUCT_DIR)',
- '<(PRODUCT_DIR)/browser_tests<(EXECUTABLE_SUFFIX)',
- '--gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch',
- '--run-manual',
- '--ui-test-action-timeout=100000',
- '--webapp-unpacked=<(PRODUCT_DIR)/remoting/remoting.webapp',
- '--extension-name=Chromoting',
],
'files': [
'../xvfb.py',
+ './browser_tests_launcher.py',
+ './browser_test_commands_linux.txt',
+ '../../remoting/tools/internal/test_accounts.json',
'<(PRODUCT_DIR)/libffmpegsumo.so',
'<(PRODUCT_DIR)/libosmesa.so',
'<(PRODUCT_DIR)/nacl_irt_x86_64.nexe',
diff --git a/third_party/tcmalloc/OWNERS b/third_party/tcmalloc/OWNERS
index 0c374cc..ba4b694 100644
--- a/third_party/tcmalloc/OWNERS
+++ b/third_party/tcmalloc/OWNERS
@@ -1,2 +1,4 @@
jar@chromium.org
+
+# On extended leave.
willchan@chromium.org
diff --git a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
index b7fd0b1..288d6cd 100644
--- a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
+++ b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
@@ -16,3 +16,6 @@
SSLUITest.TestInterstitialJavaScriptProceeds
SSLUITest.TestRefNavigation
SSLUITest.TestWSSInvalidCertAndGoForward
+
+# http://crbug.com/403007
+WorkerDevToolsSanityTest.InspectSharedWorker
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt
index 20105b9..233d06a 100644
--- a/tools/valgrind/memcheck/suppressions.txt
+++ b/tools/valgrind/memcheck/suppressions.txt
@@ -3439,3 +3439,13 @@
fun:_ZN3WTF13TextCodecUTF86encodeEPKhmNS_19UnencodableHandlingE
fun:_ZNK3WTF12TextEncoding6encodeERKNS_6StringENS_19UnencodableHandlingE
}
+{
+ bug_424575
+ Memcheck:Uninitialized
+ fun:_ZN7content13NavigatorImpl23RecordNavigationMetricsERKNS_20LoadCommittedDetailsERK44FrameHostMsg_DidCommitProvisionalLoad_ParamsPNS_12SiteInstanceE
+ fun:_ZN7content13NavigatorImpl11DidNavigateEPNS_19RenderFrameHostImplERK44FrameHostMsg_DidCommitProvisionalLoad_Params
+ fun:_ZN7content19RenderFrameHostImpl26OnDidCommitProvisionalLoadERKN3IPC7MessageE
+ fun:_ZN7content19TestRenderFrameHost26SendNavigateWithParametersEiRK4GURLN2ui14PageTransitionES3_iPKN4base8FilePathERKSt6vectorIS1_SaIS1_EE
+ fun:_ZN7content19TestRenderFrameHost41SendNavigateWithTransitionAndResponseCodeEiRK4GURLN2ui14PageTransitionEi
+ fun:_ZN7content19TestRenderFrameHost26SendNavigateWithTransitionEiRK4GURLN2ui14PageTransitionE
+}
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index 1c24bf5..474b6ef 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -212,7 +212,7 @@
DISALLOW_COPY_AND_ASSIGN(ItemMoveAnimationDelegate);
};
-// Returns true if the |item| is an folder item.
+// Returns true if the |item| is a folder item.
bool IsFolderItem(AppListItem* item) {
return (item->GetItemType() == AppListFolderItem::kItemType);
}
@@ -1388,20 +1388,42 @@
bool AppsGridView::CalculateFolderDropTarget(const gfx::Point& point,
Index* drop_target) const {
+ // Folders can't be dropped into other folders.
+ if (IsFolderItem(drag_view_->item()))
+ return false;
+
+ // A folder drop shouldn't happen on the reorder placeholder since that would
+ // be merging an item with itself.
Index nearest_tile_index(GetNearestTileIndexForPoint(point));
+ if (!IsValidIndex(nearest_tile_index) ||
+ nearest_tile_index == reorder_placeholder_) {
+ return false;
+ }
+
int distance_to_tile_center =
(point - GetExpectedTileBounds(nearest_tile_index.slot).CenterPoint())
.Length();
- if (nearest_tile_index != reorder_placeholder_ &&
- distance_to_tile_center < kFolderDroppingCircleRadius &&
- !IsFolderItem(drag_view_->item()) &&
- CanDropIntoTarget(nearest_tile_index)) {
- *drop_target = nearest_tile_index;
- DCHECK(IsValidIndex(*drop_target));
- return true;
+ if (distance_to_tile_center > kFolderDroppingCircleRadius)
+ return false;
+
+ AppListItemView* target_view =
+ GetViewDisplayedAtSlotOnCurrentPage(nearest_tile_index.slot);
+ if (!target_view)
+ return false;
+
+ AppListItem* target_item = target_view->item();
+
+ // Items can only be dropped into non-folders (which have no children) or
+ // folders that have fewer than the max allowed items.
+ // The OEM folder does not allow drag/drop of other items into it.
+ if (target_item->ChildItemCount() >= kMaxFolderItems ||
+ IsOEMFolderItem(target_item)) {
+ return false;
}
- return false;
+ *drop_target = nearest_tile_index;
+ DCHECK(IsValidIndex(*drop_target));
+ return true;
}
void AppsGridView::CalculateReorderDropTarget(const gfx::Point& point,
@@ -2086,20 +2108,6 @@
return model_->folders_enabled() && !folder_delegate_;
}
-bool AppsGridView::CanDropIntoTarget(const Index& drop_target) const {
- AppListItemView* target_view =
- GetViewDisplayedAtSlotOnCurrentPage(drop_target.slot);
- if (!target_view)
- return false;
-
- AppListItem* target_item = target_view->item();
- // Items can be dropped into non-folders (which have no children) or folders
- // that have fewer than the max allowed items.
- // OEM folder does not allow to drag/drop other items in it.
- return target_item->ChildItemCount() < kMaxFolderItems &&
- !IsOEMFolderItem(target_item);
-}
-
AppsGridView::Index AppsGridView::GetNearestTileIndexForPoint(
const gfx::Point& point) const {
gfx::Rect bounds = GetContentsBounds();
diff --git a/ui/app_list/views/apps_grid_view.h b/ui/app_list/views/apps_grid_view.h
index 3a395cb..a380b1d 100644
--- a/ui/app_list/views/apps_grid_view.h
+++ b/ui/app_list/views/apps_grid_view.h
@@ -400,10 +400,6 @@
// Whether the folder drag-and-drop UI should be enabled.
bool EnableFolderDragDropUI();
- // Whether target specified by |drap_target| can accept more items to be
- // dropped into it.
- bool CanDropIntoTarget(const Index& drop_target) const;
-
// Returns the size of the entire tile grid.
gfx::Size GetTileGridSize() const;
diff --git a/ui/app_list/views/apps_grid_view_unittest.cc b/ui/app_list/views/apps_grid_view_unittest.cc
index 492b233..144095f 100644
--- a/ui/app_list/views/apps_grid_view_unittest.cc
+++ b/ui/app_list/views/apps_grid_view_unittest.cc
@@ -485,14 +485,14 @@
int tile_height = GetItemTileRectAt(1, 0).y() - GetItemTileRectAt(0, 0).y();
// Drag left but stop before the folder dropping circle.
- drag_vector.set_x(-half_tile_width - 5);
+ drag_vector.set_x(-half_tile_width - 4);
SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
apps_grid_view_->EndDrag(false);
EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
model_->GetModelContent());
// Drag left, past the folder dropping circle.
- drag_vector.set_x(-3 * half_tile_width + 5);
+ drag_vector.set_x(-3 * half_tile_width + 4);
SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
apps_grid_view_->EndDrag(false);
EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 3233de7..5aa13ea 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -37,13 +37,15 @@
"clipboard/clipboard.cc",
"clipboard/clipboard.h",
"clipboard/clipboard_android.cc",
- "clipboard/clipboard_android_initialization.h",
+ "clipboard/clipboard_android.h",
"clipboard/clipboard_constants.cc",
+ "clipboard/clipboard_mac.h",
"clipboard/clipboard_mac.mm",
"clipboard/clipboard_types.h",
"clipboard/clipboard_util_win.cc",
"clipboard/clipboard_util_win.h",
"clipboard/clipboard_win.cc",
+ "clipboard/clipboard_win.h",
"clipboard/custom_data_helper.cc",
"clipboard/custom_data_helper.h",
"clipboard/custom_data_helper_linux.cc",
diff --git a/ui/base/android/ui_base_jni_registrar.cc b/ui/base/android/ui_base_jni_registrar.cc
index 23f3934..d4ef0db 100644
--- a/ui/base/android/ui_base_jni_registrar.cc
+++ b/ui/base/android/ui_base_jni_registrar.cc
@@ -8,7 +8,7 @@
#include "base/android/jni_registrar.h"
#include "ui/base/android/view_android.h"
#include "ui/base/android/window_android.h"
-#include "ui/base/clipboard/clipboard_android_initialization.h"
+#include "ui/base/clipboard/clipboard_android.h"
#include "ui/base/device_form_factor_android.h"
#include "ui/base/l10n/l10n_util_android.h"
#include "ui/base/resource/resource_bundle_android.h"
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc
index 84371ac..27f747a 100644
--- a/ui/base/clipboard/clipboard.cc
+++ b/ui/base/clipboard/clipboard.cc
@@ -88,7 +88,7 @@
if (it != clipboard_map->end())
return it->second;
- Clipboard* clipboard = new ui::Clipboard;
+ Clipboard* clipboard = Clipboard::Create();
clipboard_map->insert(std::make_pair(id, clipboard));
return clipboard;
}
diff --git a/ui/base/clipboard/clipboard.h b/ui/base/clipboard/clipboard.h
index afc8753..73c3aa2 100644
--- a/ui/base/clipboard/clipboard.h
+++ b/ui/base/clipboard/clipboard.h
@@ -11,7 +11,6 @@
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
-#include "base/memory/scoped_ptr.h"
#include "base/memory/shared_memory.h"
#include "base/process/process.h"
#include "base/strings/string16.h"
@@ -22,15 +21,6 @@
#if defined(OS_WIN)
#include <objidl.h>
-#elif defined(OS_ANDROID)
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#endif
-
-#if defined(USE_AURA) && defined(USE_X11)
-#include "base/memory/scoped_ptr.h"
#endif
namespace base {
@@ -88,7 +78,7 @@
#if defined(OS_WIN)
const FORMATETC& ToFormatEtc() const { return data_; }
-#elif defined(USE_AURA)
+#elif defined(USE_AURA) || defined(OS_ANDROID)
const std::string& ToString() const { return data_; }
#elif defined(OS_MACOSX)
NSString* ToNSString() const { return data_; }
@@ -113,19 +103,13 @@
#if defined(OS_WIN)
explicit FormatType(UINT native_format);
FormatType(UINT native_format, LONG index);
- UINT ToUINT() const { return data_.cfFormat; }
FORMATETC data_;
-#elif defined(USE_AURA)
+#elif defined(USE_AURA) || defined(OS_ANDROID)
explicit FormatType(const std::string& native_format);
- const std::string& data() const { return data_; }
std::string data_;
#elif defined(OS_MACOSX)
explicit FormatType(NSString* native_format);
NSString* data_;
-#elif defined(OS_ANDROID)
- explicit FormatType(const std::string& native_format);
- const std::string& data() const { return data_; }
- std::string data_;
#else
#error No FormatType definition.
#endif
@@ -211,51 +195,53 @@
// Returns a sequence number which uniquely identifies clipboard state.
// This can be used to version the data on the clipboard and determine
// whether it has changed.
- uint64 GetSequenceNumber(ClipboardType type);
+ virtual uint64 GetSequenceNumber(ClipboardType type) = 0;
// Tests whether the clipboard contains a certain format
- bool IsFormatAvailable(const FormatType& format, ClipboardType type) const;
+ virtual bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const = 0;
// Clear the clipboard data.
- void Clear(ClipboardType type);
+ virtual void Clear(ClipboardType type) = 0;
- void ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const;
+ virtual void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const = 0;
// Reads UNICODE text from the clipboard, if available.
- void ReadText(ClipboardType type, base::string16* result) const;
+ virtual void ReadText(ClipboardType type, base::string16* result) const = 0;
// Reads ASCII text from the clipboard, if available.
- void ReadAsciiText(ClipboardType type, std::string* result) const;
+ virtual void ReadAsciiText(ClipboardType type, std::string* result) const = 0;
// Reads HTML from the clipboard, if available. If the HTML fragment requires
// context to parse, |fragment_start| and |fragment_end| are indexes into
// markup indicating the beginning and end of the actual fragment. Otherwise,
// they will contain 0 and markup->size().
- void ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const;
+ virtual void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const = 0;
// Reads RTF from the clipboard, if available. Stores the result as a byte
// vector.
- void ReadRTF(ClipboardType type, std::string* result) const;
+ virtual void ReadRTF(ClipboardType type, std::string* result) const = 0;
// Reads an image from the clipboard, if available.
- SkBitmap ReadImage(ClipboardType type) const;
+ virtual SkBitmap ReadImage(ClipboardType type) const = 0;
- void ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const;
+ virtual void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const = 0;
// Reads a bookmark from the clipboard, if available.
- void ReadBookmark(base::string16* title, std::string* url) const;
+ virtual void ReadBookmark(base::string16* title, std::string* url) const = 0;
// Reads raw data from the clipboard with the given format type. Stores result
// as a byte vector.
- void ReadData(const FormatType& format, std::string* result) const;
+ virtual void ReadData(const FormatType& format,
+ std::string* result) const = 0;
// Gets the FormatType corresponding to an arbitrary format string,
// registering it with the system if needed. Due to Windows/Linux
@@ -298,6 +284,40 @@
static const FormatType& GetIDListFormatType();
#endif
+ protected:
+ static Clipboard* Create();
+
+ Clipboard() {}
+ virtual ~Clipboard() {}
+
+ // Write a bunch of objects to the system clipboard. Copies are made of the
+ // contents of |objects|.
+ virtual void WriteObjects(ClipboardType type, const ObjectMap& objects) = 0;
+
+ void DispatchObject(ObjectType type, const ObjectMapParams& params);
+
+ virtual void WriteText(const char* text_data, size_t text_len) = 0;
+
+ virtual void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) = 0;
+
+ virtual void WriteRTF(const char* rtf_data, size_t data_len) = 0;
+
+ virtual void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) = 0;
+
+ virtual void WriteWebSmartPaste() = 0;
+
+ virtual void WriteBitmap(const SkBitmap& bitmap) = 0;
+
+ virtual void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) = 0;
+
private:
FRIEND_TEST_ALL_PREFIXES(ClipboardTest, SharedBitmapTest);
FRIEND_TEST_ALL_PREFIXES(ClipboardTest, EmptyHTMLTest);
@@ -307,65 +327,6 @@
friend class content::ClipboardMessageFilter;
friend class ScopedClipboardWriter;
- Clipboard();
- ~Clipboard();
-
- // Write a bunch of objects to the system clipboard. Copies are made of the
- // contents of |objects|.
- void WriteObjects(ClipboardType type, const ObjectMap& objects);
-
- void DispatchObject(ObjectType type, const ObjectMapParams& params);
-
- void WriteText(const char* text_data, size_t text_len);
-
- void WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len);
-
- void WriteRTF(const char* rtf_data, size_t data_len);
-
- void WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len);
-
- void WriteWebSmartPaste();
-
- void WriteBitmap(const SkBitmap& bitmap);
-
- void WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len);
-#if defined(OS_WIN)
- void WriteBitmapFromHandle(HBITMAP source_hbitmap,
- const gfx::Size& size);
-
- // Safely write to system clipboard. Free |handle| on failure.
- void WriteToClipboard(unsigned int format, HANDLE handle);
-
- static void ParseBookmarkClipboardFormat(const base::string16& bookmark,
- base::string16* title,
- std::string* url);
-
- // Free a handle depending on its type (as intuited from format)
- static void FreeData(unsigned int format, HANDLE data);
-
- // Return the window that should be the clipboard owner, creating it
- // if neccessary. Marked const for lazily initialization by const methods.
- HWND GetClipboardWindow() const;
-
- // Mark this as mutable so const methods can still do lazy initialization.
- mutable scoped_ptr<base::win::MessageWindow> clipboard_owner_;
-
-#elif defined(USE_CLIPBOARD_AURAX11)
- private:
- // We keep our implementation details private because otherwise we bring in
- // the X11 headers and break chrome compile.
- class AuraX11Details;
- scoped_ptr<AuraX11Details> aurax11_details_;
-#endif
-
DISALLOW_COPY_AND_ASSIGN(Clipboard);
};
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc
index a6631af..8b25b7c 100644
--- a/ui/base/clipboard/clipboard_android.cc
+++ b/ui/base/clipboard/clipboard_android.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_android.h"
#include "base/android/jni_string.h"
#include "base/lazy_instance.h"
@@ -11,7 +11,6 @@
#include "base/synchronization/lock.h"
#include "jni/Clipboard_jni.h"
#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/clipboard/clipboard_android_initialization.h"
#include "ui/gfx/size.h"
// TODO:(andrewhayden) Support additional formats in Android: Bitmap, URI, HTML,
@@ -258,16 +257,22 @@
return type;
}
-// Clipboard implementation.
-Clipboard::Clipboard() {
+// Clipboard factory method.
+// static
+Clipboard* Clipboard::Create() {
+ return new ClipboardAndroid;
+}
+
+// ClipboardAndroid implementation.
+ClipboardAndroid::ClipboardAndroid() {
DCHECK(CalledOnValidThread());
}
-Clipboard::~Clipboard() {
+ClipboardAndroid::~ClipboardAndroid() {
DCHECK(CalledOnValidThread());
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType /* type */) {
+uint64 ClipboardAndroid::GetSequenceNumber(ClipboardType /* type */) {
DCHECK(CalledOnValidThread());
// TODO: implement this. For now this interface will advertise
// that the clipboard never changes. That's fine as long as we
@@ -275,22 +280,22 @@
return 0;
}
-bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
- ClipboardType type) const {
+bool ClipboardAndroid::IsFormatAvailable(const Clipboard::FormatType& format,
+ ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
- return g_map.Get().HasFormat(format.data());
+ return g_map.Get().HasFormat(format.ToString());
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardAndroid::Clear(ClipboardType type) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
g_map.Get().Clear();
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardAndroid::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -305,7 +310,8 @@
*contains_filenames = false;
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardAndroid::ReadText(ClipboardType type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
std::string utf8;
@@ -313,18 +319,19 @@
*result = base::UTF8ToUTF16(utf8);
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardAndroid::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
*result = g_map.Get().Get(kPlainTextFormat);
}
// Note: |src_url| isn't really used. It is only implemented in Windows
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardAndroid::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
if (src_url)
@@ -337,12 +344,12 @@
*fragment_end = static_cast<uint32>(markup->length());
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardAndroid::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardAndroid::ReadImage(ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
std::string input = g_map.Get().Get(kBitmapFormat);
@@ -361,66 +368,70 @@
return bmp;
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardAndroid::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardAndroid::ReadBookmark(base::string16* title,
+ std::string* url) const {
DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
}
-void Clipboard::ReadData(const Clipboard::FormatType& format,
- std::string* result) const {
+void ClipboardAndroid::ReadData(const Clipboard::FormatType& format,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
- *result = g_map.Get().Get(format.data());
+ *result = g_map.Get().Get(format.ToString());
}
// Main entry point used to write several values in the clipboard.
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardAndroid::WriteObjects(ClipboardType type,
+ const ObjectMap& objects) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
g_map.Get().Clear();
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardAndroid::WriteText(const char* text_data, size_t text_len) {
g_map.Get().Set(kPlainTextFormat, std::string(text_data, text_len));
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardAndroid::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
g_map.Get().Set(kHTMLFormat, std::string(markup_data, markup_len));
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardAndroid::WriteRTF(const char* rtf_data, size_t data_len) {
NOTIMPLEMENTED();
}
// Note: according to other platforms implementations, this really writes the
// URL spec.
-void Clipboard::WriteBookmark(const char* title_data, size_t title_len,
- const char* url_data, size_t url_len) {
+void ClipboardAndroid::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
g_map.Get().Set(kBookmarkFormat, std::string(url_data, url_len));
}
// Write an extra flavor that signifies WebKit was the last to modify the
// pasteboard. This flavor has no data.
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardAndroid::WriteWebSmartPaste() {
g_map.Get().Set(kWebKitSmartPasteFormat, std::string());
}
// Note: we implement this to pass all unit tests but it is currently unclear
// how some code would consume this.
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardAndroid::WriteBitmap(const SkBitmap& bitmap) {
gfx::Size size(bitmap.width(), bitmap.height());
std::string packed(reinterpret_cast<const char*>(&size), sizeof(size));
@@ -432,12 +443,12 @@
g_map.Get().Set(kBitmapFormat, packed);
}
-void Clipboard::WriteData(const Clipboard::FormatType& format,
- const char* data_data, size_t data_len) {
- g_map.Get().Set(format.data(), std::string(data_data, data_len));
+void ClipboardAndroid::WriteData(const Clipboard::FormatType& format,
+ const char* data_data,
+ size_t data_len) {
+ g_map.Get().Set(format.ToString(), std::string(data_data, data_len));
}
-// See clipboard_android_initialization.h for more information.
bool RegisterClipboardAndroid(JNIEnv* env) {
return RegisterNativesImpl(env);
}
diff --git a/ui/base/clipboard/clipboard_android.h b/ui/base/clipboard/clipboard_android.h
new file mode 100644
index 0000000..65287bf
--- /dev/null
+++ b/ui/base/clipboard/clipboard_android.h
@@ -0,0 +1,67 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
+
+#include "ui/base/clipboard/clipboard.h"
+
+#include <jni.h>
+
+namespace ui {
+
+bool RegisterClipboardAndroid(JNIEnv* env);
+
+class ClipboardAndroid : public Clipboard {
+ private:
+ friend class Clipboard;
+
+ ClipboardAndroid();
+ ~ClipboardAndroid() override;
+
+ // Clipboard overrides:
+ uint64 GetSequenceNumber(ClipboardType type) override;
+ bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const override;
+ void Clear(ClipboardType type) override;
+ void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const override;
+ void ReadText(ClipboardType type, base::string16* result) const override;
+ void ReadAsciiText(ClipboardType type, std::string* result) const override;
+ void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const override;
+ void ReadRTF(ClipboardType type, std::string* result) const override;
+ SkBitmap ReadImage(ClipboardType type) const override;
+ void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const override;
+ void ReadBookmark(base::string16* title, std::string* url) const override;
+ void ReadData(const FormatType& format, std::string* result) const override;
+ void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
+ void WriteText(const char* text_data, size_t text_len) override;
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteRTF(const char* rtf_data, size_t data_len) override;
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteWebSmartPaste() override;
+ void WriteBitmap(const SkBitmap& bitmap) override;
+ void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) override;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardAndroid);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
diff --git a/ui/base/clipboard/clipboard_android_initialization.h b/ui/base/clipboard/clipboard_android_initialization.h
deleted file mode 100644
index dca59c1..0000000
--- a/ui/base/clipboard/clipboard_android_initialization.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file exists to help bind the Android clipboard implementation's JNI
-// methods statically. Since the JNI header file that contains the static
-// registration method is autogenerated and since the general clipboard.h
-// file is platform-independent, a new header file (this) is the cleanest
-// option for holding this function (as it is specific to Android).
-
-#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_INITIALIZATION_H_
-#define UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_INITIALIZATION_H_
-
-#include <jni.h>
-
-namespace ui {
-
-bool RegisterClipboardAndroid(JNIEnv* env);
-
-} // namespace ui
-
-#endif // UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_INITIALIZATION_H_
diff --git a/ui/base/clipboard/clipboard_aura.cc b/ui/base/clipboard/clipboard_aura.cc
index efd484b..166f3bb 100644
--- a/ui/base/clipboard/clipboard_aura.cc
+++ b/ui/base/clipboard/clipboard_aura.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_aura.h"
#include <list>
@@ -406,7 +406,7 @@
} // namespace
-// Clipboard FormatType implementation.
+// Clipboard::FormatType implementation.
Clipboard::FormatType::FormatType() {
}
@@ -511,25 +511,30 @@
return type;
}
-// Clipboard implementation.
-Clipboard::Clipboard() {
+// Clipboard factory method.
+Clipboard* Clipboard::Create() {
+ return new ClipboardAura;
+}
+
+// ClipboardAura implementation.
+ClipboardAura::ClipboardAura() {
DCHECK(CalledOnValidThread());
// Make sure clipboard is created.
GetClipboard();
}
-Clipboard::~Clipboard() {
+ClipboardAura::~ClipboardAura() {
DCHECK(CalledOnValidThread());
DeleteClipboard();
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
+uint64 ClipboardAura::GetSequenceNumber(ClipboardType type) {
DCHECK(CalledOnValidThread());
return GetClipboard()->sequence_number();
}
-bool Clipboard::IsFormatAvailable(const FormatType& format,
- ClipboardType type) const {
+bool ClipboardAura::IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
AuraClipboard* clipboard = GetClipboard();
@@ -552,16 +557,16 @@
return false;
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardAura::Clear(ClipboardType type) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
AuraClipboard* clipboard = GetClipboard();
clipboard->Clear();
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardAura::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
DCHECK(CalledOnValidThread());
if (!types || !contains_filenames) {
NOTREACHED();
@@ -586,95 +591,98 @@
}
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardAura::ReadText(ClipboardType type, base::string16* result) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadText(result);
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardAura::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadAsciiText(result);
}
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardAura::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadHTML(markup, src_url, fragment_start, fragment_end);
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardAura::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadRTF(result);
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardAura::ReadImage(ClipboardType type) const {
DCHECK(CalledOnValidThread());
return GetClipboard()->ReadImage();
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardAura::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadCustomData(type, result);
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardAura::ReadBookmark(base::string16* title,
+ std::string* url) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadBookmark(title, url);
}
-void Clipboard::ReadData(const FormatType& format, std::string* result) const {
+void ClipboardAura::ReadData(const FormatType& format,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
GetClipboard()->ReadData(format.ToString(), result);
}
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardAura::WriteObjects(ClipboardType type, const ObjectMap& objects) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
ClipboardDataBuilder::CommitToClipboard();
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardAura::WriteText(const char* text_data, size_t text_len) {
ClipboardDataBuilder::WriteText(text_data, text_len);
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardAura::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
ClipboardDataBuilder::WriteHTML(markup_data, markup_len, url_data, url_len);
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardAura::WriteRTF(const char* rtf_data, size_t data_len) {
ClipboardDataBuilder::WriteRTF(rtf_data, data_len);
}
-void Clipboard::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardAura::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
ClipboardDataBuilder::WriteBookmark(title_data, title_len, url_data, url_len);
}
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardAura::WriteWebSmartPaste() {
ClipboardDataBuilder::WriteWebSmartPaste();
}
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardAura::WriteBitmap(const SkBitmap& bitmap) {
ClipboardDataBuilder::WriteBitmap(bitmap);
}
-void Clipboard::WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len) {
+void ClipboardAura::WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) {
ClipboardDataBuilder::WriteData(format.ToString(), data_data, data_len);
}
diff --git a/ui/base/clipboard/clipboard_aura.h b/ui/base/clipboard/clipboard_aura.h
new file mode 100644
index 0000000..bb2fbc6
--- /dev/null
+++ b/ui/base/clipboard/clipboard_aura.h
@@ -0,0 +1,63 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
+
+#include "ui/base/clipboard/clipboard.h"
+
+namespace ui {
+
+class ClipboardAura : public Clipboard {
+ private:
+ friend class Clipboard;
+
+ ClipboardAura();
+ ~ClipboardAura() override;
+
+ // Clipboard overrides:
+ uint64 GetSequenceNumber(ClipboardType type) override;
+ bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const override;
+ void Clear(ClipboardType type) override;
+ void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const override;
+ void ReadText(ClipboardType type, base::string16* result) const override;
+ void ReadAsciiText(ClipboardType type, std::string* result) const override;
+ void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const override;
+ void ReadRTF(ClipboardType type, std::string* result) const override;
+ SkBitmap ReadImage(ClipboardType type) const override;
+ void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const override;
+ void ReadBookmark(base::string16* title, std::string* url) const override;
+ void ReadData(const FormatType& format, std::string* result) const override;
+ void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
+ void WriteText(const char* text_data, size_t text_len) override;
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteRTF(const char* rtf_data, size_t data_len) override;
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteWebSmartPaste() override;
+ void WriteBitmap(const SkBitmap& bitmap) override;
+ void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) override;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardAura);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_AURA_H_
diff --git a/ui/base/clipboard/clipboard_aurax11.cc b/ui/base/clipboard/clipboard_aurax11.cc
index e79f28b..b12c696 100644
--- a/ui/base/clipboard/clipboard_aurax11.cc
+++ b/ui/base/clipboard/clipboard_aurax11.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_aurax11.h"
#include <X11/extensions/Xfixes.h>
#include <X11/Xatom.h>
@@ -222,11 +222,11 @@
}
///////////////////////////////////////////////////////////////////////////////
-// Clipboard::AuraX11Details
+// ClipboardAuraX11::AuraX11Details
// Private implementation of our X11 integration. Keeps X11 headers out of the
// majority of chrome, which break badly.
-class Clipboard::AuraX11Details : public PlatformEventDispatcher {
+class ClipboardAuraX11::AuraX11Details : public PlatformEventDispatcher {
public:
AuraX11Details();
virtual ~AuraX11Details();
@@ -315,18 +315,21 @@
DISALLOW_COPY_AND_ASSIGN(AuraX11Details);
};
-Clipboard::AuraX11Details::AuraX11Details()
+ClipboardAuraX11::AuraX11Details::AuraX11Details()
: x_display_(gfx::GetXDisplay()),
x_root_window_(DefaultRootWindow(x_display_)),
- x_window_(XCreateWindow(
- x_display_, x_root_window_,
- -100, -100, 10, 10, // x, y, width, height
- 0, // border width
- CopyFromParent, // depth
- InputOnly,
- CopyFromParent, // visual
- 0,
- NULL)),
+ x_window_(XCreateWindow(x_display_,
+ x_root_window_,
+ -100,
+ -100,
+ 10,
+ 10, // x, y, width, height
+ 0, // border width
+ CopyFromParent, // depth
+ InputOnly,
+ CopyFromParent, // visual
+ 0,
+ NULL)),
atom_cache_(x_display_, kAtomsToCache),
selection_requestor_(x_display_, x_window_, this),
clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)),
@@ -341,14 +344,14 @@
PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
}
-Clipboard::AuraX11Details::~AuraX11Details() {
+ClipboardAuraX11::AuraX11Details::~AuraX11Details() {
if (PlatformEventSource::GetInstance())
PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
XDestroyWindow(x_display_, x_window_);
}
-::Atom Clipboard::AuraX11Details::LookupSelectionForClipboardType(
+::Atom ClipboardAuraX11::AuraX11Details::LookupSelectionForClipboardType(
ClipboardType type) const {
if (type == CLIPBOARD_TYPE_COPY_PASTE)
return GetCopyPasteSelection();
@@ -356,12 +359,12 @@
return XA_PRIMARY;
}
-::Atom Clipboard::AuraX11Details::GetCopyPasteSelection() const {
+::Atom ClipboardAuraX11::AuraX11Details::GetCopyPasteSelection() const {
return atom_cache_.GetAtom(kClipboard);
}
-const SelectionFormatMap& Clipboard::AuraX11Details::LookupStorageForAtom(
- ::Atom atom) {
+const SelectionFormatMap&
+ClipboardAuraX11::AuraX11Details::LookupStorageForAtom(::Atom atom) {
if (atom == XA_PRIMARY)
return primary_owner_.selection_format_map();
@@ -369,27 +372,28 @@
return clipboard_owner_.selection_format_map();
}
-void Clipboard::AuraX11Details::CreateNewClipboardData() {
+void ClipboardAuraX11::AuraX11Details::CreateNewClipboardData() {
clipboard_data_ = SelectionFormatMap();
}
-void Clipboard::AuraX11Details::InsertMapping(
+void ClipboardAuraX11::AuraX11Details::InsertMapping(
const std::string& key,
const scoped_refptr<base::RefCountedMemory>& memory) {
::Atom atom_key = atom_cache_.GetAtom(key.c_str());
clipboard_data_.Insert(atom_key, memory);
}
-void Clipboard::AuraX11Details::TakeOwnershipOfSelection(ClipboardType type) {
+void ClipboardAuraX11::AuraX11Details::TakeOwnershipOfSelection(
+ ClipboardType type) {
if (type == CLIPBOARD_TYPE_COPY_PASTE)
return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_);
else
return primary_owner_.TakeOwnershipOfSelection(clipboard_data_);
}
-SelectionData Clipboard::AuraX11Details::RequestAndWaitForTypes(
+SelectionData ClipboardAuraX11::AuraX11Details::RequestAndWaitForTypes(
ClipboardType type,
- const std::vector< ::Atom>& types) {
+ const std::vector<::Atom>& types) {
::Atom selection_name = LookupSelectionForClipboardType(type);
if (XGetSelectionOwner(x_display_, selection_name) == x_window_) {
// We can local fastpath instead of playing the nested message loop game
@@ -415,7 +419,7 @@
return SelectionData();
}
-TargetList Clipboard::AuraX11Details::WaitAndGetTargetsList(
+TargetList ClipboardAuraX11::AuraX11Details::WaitAndGetTargetsList(
ClipboardType type) {
::Atom selection_name = LookupSelectionForClipboardType(type);
std::vector< ::Atom> out;
@@ -471,25 +475,25 @@
return TargetList(out, &atom_cache_);
}
-std::vector< ::Atom> Clipboard::AuraX11Details::GetTextAtoms() const {
+std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetTextAtoms() const {
return GetTextAtomsFrom(&atom_cache_);
}
-std::vector< ::Atom> Clipboard::AuraX11Details::GetAtomsForFormat(
+std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetAtomsForFormat(
const Clipboard::FormatType& format) {
std::vector< ::Atom> atoms;
atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str()));
return atoms;
}
-void Clipboard::AuraX11Details::Clear(ClipboardType type) {
+void ClipboardAuraX11::AuraX11Details::Clear(ClipboardType type) {
if (type == CLIPBOARD_TYPE_COPY_PASTE)
clipboard_owner_.ClearSelectionOwner();
else
primary_owner_.ClearSelectionOwner();
}
-void Clipboard::AuraX11Details::StoreCopyPasteDataAndWait() {
+void ClipboardAuraX11::AuraX11Details::StoreCopyPasteDataAndWait() {
::Atom selection = GetCopyPasteSelection();
if (XGetSelectionOwner(x_display_, selection) != x_window_)
return;
@@ -512,7 +516,8 @@
base::TimeTicks::Now() - start);
}
-bool Clipboard::AuraX11Details::CanDispatchEvent(const PlatformEvent& event) {
+bool ClipboardAuraX11::AuraX11Details::CanDispatchEvent(
+ const PlatformEvent& event) {
if (event->xany.window == x_window_)
return true;
@@ -524,7 +529,8 @@
return false;
}
-uint32_t Clipboard::AuraX11Details::DispatchEvent(const PlatformEvent& xev) {
+uint32_t ClipboardAuraX11::AuraX11Details::DispatchEvent(
+ const PlatformEvent& xev) {
switch (xev->type) {
case SelectionRequest: {
if (xev->xselectionrequest.selection == XA_PRIMARY) {
@@ -646,20 +652,25 @@
}
///////////////////////////////////////////////////////////////////////////////
-// Clipboard
+// Clipboard factory method.
+Clipboard* Clipboard::Create() {
+ return new ClipboardAuraX11;
+}
-Clipboard::Clipboard()
- : aurax11_details_(new AuraX11Details) {
+///////////////////////////////////////////////////////////////////////////////
+// ClipboardAuraX11
+
+ClipboardAuraX11::ClipboardAuraX11() : aurax11_details_(new AuraX11Details) {
DCHECK(CalledOnValidThread());
}
-Clipboard::~Clipboard() {
+ClipboardAuraX11::~ClipboardAuraX11() {
DCHECK(CalledOnValidThread());
aurax11_details_->StoreCopyPasteDataAndWait();
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
+uint64 ClipboardAuraX11::GetSequenceNumber(ClipboardType type) {
DCHECK(CalledOnValidThread());
if (type == CLIPBOARD_TYPE_COPY_PASTE)
return SelectionChangeObserver::GetInstance()->clipboard_sequence_number();
@@ -667,8 +678,8 @@
return SelectionChangeObserver::GetInstance()->primary_sequence_number();
}
-bool Clipboard::IsFormatAvailable(const FormatType& format,
- ClipboardType type) const {
+bool ClipboardAuraX11::IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
@@ -680,15 +691,15 @@
return target_list.ContainsFormat(format);
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardAuraX11::Clear(ClipboardType type) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
aurax11_details_->Clear(type);
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardAuraX11::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
DCHECK(CalledOnValidThread());
if (!types || !contains_filenames) {
NOTREACHED();
@@ -715,7 +726,8 @@
ReadCustomDataTypes(data.GetData(), data.GetSize(), types);
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardAuraX11::ReadText(ClipboardType type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -726,7 +738,8 @@
}
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardAuraX11::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -737,11 +750,11 @@
// TODO(estade): handle different charsets.
// TODO(port): set *src_url.
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardAuraX11::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK(CalledOnValidThread());
markup->clear();
if (src_url)
@@ -760,7 +773,7 @@
}
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardAuraX11::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -769,7 +782,7 @@
data.AssignTo(result);
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardAuraX11::ReadImage(ClipboardType type) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -783,9 +796,9 @@
return SkBitmap();
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardAuraX11::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -795,13 +808,15 @@
ReadCustomDataForType(data.GetData(), data.GetSize(), type, result);
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardAuraX11::ReadBookmark(base::string16* title,
+ std::string* url) const {
DCHECK(CalledOnValidThread());
// TODO(erg): This was left NOTIMPLEMENTED() in the gtk port too.
NOTIMPLEMENTED();
}
-void Clipboard::ReadData(const FormatType& format, std::string* result) const {
+void ClipboardAuraX11::ReadData(const FormatType& format,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
SelectionData data(aurax11_details_->RequestAndWaitForTypes(
@@ -810,13 +825,14 @@
data.AssignTo(result);
}
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardAuraX11::WriteObjects(ClipboardType type,
+ const ObjectMap& objects) {
DCHECK(CalledOnValidThread());
DCHECK(IsSupportedClipboardType(type));
aurax11_details_->CreateNewClipboardData();
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
aurax11_details_->TakeOwnershipOfSelection(type);
@@ -836,7 +852,7 @@
}
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardAuraX11::WriteText(const char* text_data, size_t text_len) {
std::string str(text_data, text_len);
scoped_refptr<base::RefCountedMemory> mem(
base::RefCountedString::TakeString(&str));
@@ -847,10 +863,10 @@
aurax11_details_->InsertMapping(kUtf8String, mem);
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardAuraX11::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
// TODO(estade): We need to expand relative links with |url_data|.
static const char* html_prefix = "<meta http-equiv=\"content-type\" "
"content=\"text/html; charset=utf-8\">";
@@ -864,14 +880,14 @@
aurax11_details_->InsertMapping(kMimeTypeHTML, mem);
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardAuraX11::WriteRTF(const char* rtf_data, size_t data_len) {
WriteData(GetRtfFormatType(), rtf_data, data_len);
}
-void Clipboard::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardAuraX11::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
// Write as a mozilla url (UTF16: URL, newline, title).
base::string16 url = base::UTF8ToUTF16(std::string(url_data, url_len) + "\n");
base::string16 title = base::UTF8ToUTF16(std::string(title_data, title_len));
@@ -887,7 +903,7 @@
// Write an extra flavor that signifies WebKit was the last to modify the
// pasteboard. This flavor has no data.
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardAuraX11::WriteWebSmartPaste() {
std::string empty;
aurax11_details_->InsertMapping(
kMimeTypeWebkitSmartPaste,
@@ -895,7 +911,7 @@
base::RefCountedString::TakeString(&empty)));
}
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardAuraX11::WriteBitmap(const SkBitmap& bitmap) {
// Encode the bitmap as a PNG for transport.
std::vector<unsigned char> output;
if (gfx::PNGCodec::FastEncodeBGRASkBitmap(bitmap, false, &output)) {
@@ -905,9 +921,9 @@
}
}
-void Clipboard::WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len) {
+void ClipboardAuraX11::WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) {
// We assume that certain mapping types are only written by trusted code.
// Therefore we must upkeep their integrity.
if (format.Equals(GetBitmapFormatType()))
diff --git a/ui/base/clipboard/clipboard_aurax11.h b/ui/base/clipboard/clipboard_aurax11.h
new file mode 100644
index 0000000..fa734c0
--- /dev/null
+++ b/ui/base/clipboard/clipboard_aurax11.h
@@ -0,0 +1,70 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_AURAX11_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_AURAX11_H_
+
+#include "ui/base/clipboard/clipboard.h"
+
+#include "base/memory/scoped_ptr.h"
+
+namespace ui {
+
+class ClipboardAuraX11 : public Clipboard {
+ private:
+ friend class Clipboard;
+
+ ClipboardAuraX11();
+ ~ClipboardAuraX11() override;
+
+ // Clipboard overrides:
+ uint64 GetSequenceNumber(ClipboardType type) override;
+ bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const override;
+ void Clear(ClipboardType type) override;
+ void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const override;
+ void ReadText(ClipboardType type, base::string16* result) const override;
+ void ReadAsciiText(ClipboardType type, std::string* result) const override;
+ void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const override;
+ void ReadRTF(ClipboardType type, std::string* result) const override;
+ SkBitmap ReadImage(ClipboardType type) const override;
+ void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const override;
+ void ReadBookmark(base::string16* title, std::string* url) const override;
+ void ReadData(const FormatType& format, std::string* result) const override;
+ void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
+ void WriteText(const char* text_data, size_t text_len) override;
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteRTF(const char* rtf_data, size_t data_len) override;
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteWebSmartPaste() override;
+ void WriteBitmap(const SkBitmap& bitmap) override;
+ void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) override;
+
+ // TODO(dcheng): Is this still needed now that each platform clipboard has its
+ // own class derived from Clipboard?
+ class AuraX11Details;
+ scoped_ptr<AuraX11Details> aurax11_details_;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardAuraX11);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_AURAX11_H_
diff --git a/ui/base/clipboard/clipboard_mac.h b/ui/base/clipboard/clipboard_mac.h
new file mode 100644
index 0000000..203c374
--- /dev/null
+++ b/ui/base/clipboard/clipboard_mac.h
@@ -0,0 +1,63 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_MAC_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_MAC_H_
+
+#include "ui/base/clipboard/clipboard.h"
+
+namespace ui {
+
+class ClipboardMac : public Clipboard {
+ private:
+ friend class Clipboard;
+
+ ClipboardMac();
+ ~ClipboardMac() override;
+
+ // Clipboard overrides:
+ uint64 GetSequenceNumber(ClipboardType type) override;
+ bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const override;
+ void Clear(ClipboardType type) override;
+ void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const override;
+ void ReadText(ClipboardType type, base::string16* result) const override;
+ void ReadAsciiText(ClipboardType type, std::string* result) const override;
+ void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const override;
+ void ReadRTF(ClipboardType type, std::string* result) const override;
+ SkBitmap ReadImage(ClipboardType type) const override;
+ void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const override;
+ void ReadBookmark(base::string16* title, std::string* url) const override;
+ void ReadData(const FormatType& format, std::string* result) const override;
+ void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
+ void WriteText(const char* text_data, size_t text_len) override;
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteRTF(const char* rtf_data, size_t data_len) override;
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteWebSmartPaste() override;
+ void WriteBitmap(const SkBitmap& bitmap) override;
+ void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) override;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardMac);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_MAC_H_
diff --git a/ui/base/clipboard/clipboard_mac.mm b/ui/base/clipboard/clipboard_mac.mm
index 88a9ff1..63c1edf 100644
--- a/ui/base/clipboard/clipboard_mac.mm
+++ b/ui/base/clipboard/clipboard_mac.mm
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_mac.h"
#import <Cocoa/Cocoa.h>
@@ -165,16 +165,22 @@
return type;
}
-// Clipboard implementation.
-Clipboard::Clipboard() {
+// Clipboard factory method.
+// static
+Clipboard* Clipboard::Create() {
+ return new ClipboardMac;
+}
+
+// ClipboardMac implementation.
+ClipboardMac::ClipboardMac() {
DCHECK(CalledOnValidThread());
}
-Clipboard::~Clipboard() {
+ClipboardMac::~ClipboardMac() {
DCHECK(CalledOnValidThread());
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
+uint64 ClipboardMac::GetSequenceNumber(ClipboardType type) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -182,8 +188,8 @@
return [pb changeCount];
}
-bool Clipboard::IsFormatAvailable(const FormatType& format,
- ClipboardType type) const {
+bool ClipboardMac::IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -199,7 +205,7 @@
return [types containsObject:format.ToNSString()];
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardMac::Clear(ClipboardType type) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -207,9 +213,9 @@
[pb declareTypes:[NSArray array] owner:nil];
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardMac::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
DCHECK(CalledOnValidThread());
types->clear();
if (IsFormatAvailable(Clipboard::GetPlainTextFormatType(), type))
@@ -230,7 +236,7 @@
}
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardMac::ReadText(ClipboardType type, base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
NSPasteboard* pb = GetPasteboard();
@@ -239,7 +245,8 @@
*result = base::SysNSStringToUTF16(contents);
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardMac::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
NSPasteboard* pb = GetPasteboard();
@@ -251,11 +258,11 @@
result->assign([contents UTF8String]);
}
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardMac::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -282,14 +289,14 @@
*fragment_end = static_cast<uint32>(markup->length());
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardMac::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
return ReadData(GetRtfFormatType(), result);
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardMac::ReadImage(ClipboardType type) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -307,9 +314,9 @@
return bitmap;
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardMac::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK(CalledOnValidThread());
DCHECK_EQ(clipboard_type, CLIPBOARD_TYPE_COPY_PASTE);
@@ -321,7 +328,7 @@
}
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardMac::ReadBookmark(base::string16* title, std::string* url) const {
DCHECK(CalledOnValidThread());
NSPasteboard* pb = GetPasteboard();
@@ -339,7 +346,8 @@
}
}
-void Clipboard::ReadData(const FormatType& format, std::string* result) const {
+void ClipboardMac::ReadData(const FormatType& format,
+ std::string* result) const {
DCHECK(CalledOnValidThread());
NSPasteboard* pb = GetPasteboard();
NSData* data = [pb dataForType:format.ToNSString()];
@@ -347,35 +355,35 @@
result->assign(static_cast<const char*>([data bytes]), [data length]);
}
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardMac::WriteObjects(ClipboardType type, const ObjectMap& objects) {
DCHECK(CalledOnValidThread());
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
NSPasteboard* pb = GetPasteboard();
[pb declareTypes:[NSArray array] owner:nil];
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardMac::WriteText(const char* text_data, size_t text_len) {
std::string text_str(text_data, text_len);
- NSString *text = base::SysUTF8ToNSString(text_str);
+ NSString* text = base::SysUTF8ToNSString(text_str);
NSPasteboard* pb = GetPasteboard();
[pb addTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[pb setString:text forType:NSStringPboardType];
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardMac::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
// We need to mark it as utf-8. (see crbug.com/11957)
std::string html_fragment_str("<meta charset='utf-8'>");
html_fragment_str.append(markup_data, markup_len);
- NSString *html_fragment = base::SysUTF8ToNSString(html_fragment_str);
+ NSString* html_fragment = base::SysUTF8ToNSString(html_fragment_str);
// TODO(avi): url_data?
NSPasteboard* pb = GetPasteboard();
@@ -383,18 +391,18 @@
[pb setString:html_fragment forType:NSHTMLPboardType];
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardMac::WriteRTF(const char* rtf_data, size_t data_len) {
WriteData(GetRtfFormatType(), rtf_data, data_len);
}
-void Clipboard::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardMac::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
std::string title_str(title_data, title_len);
- NSString *title = base::SysUTF8ToNSString(title_str);
+ NSString* title = base::SysUTF8ToNSString(title_str);
std::string url_str(url_data, url_len);
- NSString *url = base::SysUTF8ToNSString(url_str);
+ NSString* url = base::SysUTF8ToNSString(url_str);
// TODO(playmobil): In the Windows version of this function, an HTML
// representation of the bookmark is also added to the clipboard, to support
@@ -404,31 +412,29 @@
NSPasteboard* pb = GetPasteboard();
// passing UTIs into the pasteboard methods is valid >= 10.5
- [pb addTypes:[NSArray arrayWithObjects:NSURLPboardType,
- kUTTypeURLName,
- nil]
+ [pb addTypes:[NSArray arrayWithObjects:NSURLPboardType, kUTTypeURLName, nil]
owner:nil];
[nsurl writeToPasteboard:pb];
[pb setString:title forType:kUTTypeURLName];
}
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardMac::WriteBitmap(const SkBitmap& bitmap) {
NSImage* image = gfx::SkBitmapToNSImageWithColorSpace(
bitmap, base::mac::GetSystemColorSpace());
// An API to ask the NSImage to write itself to the clipboard comes in 10.6 :(
// For now, spit out the image as a TIFF.
NSPasteboard* pb = GetPasteboard();
[pb addTypes:[NSArray arrayWithObject:NSTIFFPboardType] owner:nil];
- NSData *tiff_data = [image TIFFRepresentation];
+ NSData* tiff_data = [image TIFFRepresentation];
LOG_IF(ERROR, tiff_data == NULL) << "Failed to allocate image for clipboard";
if (tiff_data) {
[pb setData:tiff_data forType:NSTIFFPboardType];
}
}
-void Clipboard::WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len) {
+void ClipboardMac::WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) {
NSPasteboard* pb = GetPasteboard();
[pb addTypes:[NSArray arrayWithObject:format.ToNSString()] owner:nil];
[pb setData:[NSData dataWithBytes:data_data length:data_len]
@@ -437,7 +443,7 @@
// Write an extra flavor that signifies WebKit was the last to modify the
// pasteboard. This flavor has no data.
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardMac::WriteWebSmartPaste() {
NSPasteboard* pb = GetPasteboard();
NSString* format = GetWebKitSmartPasteFormatType().ToNSString();
[pb addTypes:[NSArray arrayWithObject:format] owner:nil];
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc
index 18a42e2..b269351 100644
--- a/ui/base/clipboard/clipboard_win.cc
+++ b/ui/base/clipboard/clipboard_win.cc
@@ -5,7 +5,7 @@
// Many of these functions are based on those found in
// webkit/port/platform/PasteboardWin.cpp
-#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_win.h"
#include <shellapi.h>
#include <shlobj.h>
@@ -159,6 +159,31 @@
}
}
+void ParseBookmarkClipboardFormat(const base::string16& bookmark,
+ base::string16* title,
+ std::string* url) {
+ const base::string16 kDelim = base::ASCIIToUTF16("\r\n");
+
+ const size_t title_end = bookmark.find_first_of(kDelim);
+ if (title)
+ title->assign(bookmark.substr(0, title_end));
+
+ if (url) {
+ const size_t url_start = bookmark.find_first_not_of(kDelim, title_end);
+ if (url_start != base::string16::npos) {
+ *url =
+ base::UTF16ToUTF8(bookmark.substr(url_start, base::string16::npos));
+ }
+ }
+}
+
+void FreeData(unsigned int format, HANDLE data) {
+ if (format == CF_BITMAP)
+ ::DeleteObject(static_cast<HBITMAP>(data));
+ else
+ ::GlobalFree(data);
+}
+
} // namespace
// Clipboard::FormatType implementation.
@@ -201,11 +226,11 @@
}
bool Clipboard::FormatType::operator<(const FormatType& other) const {
- return ToUINT() < other.ToUINT();
+ return data_.cfFormat < other.data_.cfFormat;
}
bool Clipboard::FormatType::Equals(const FormatType& other) const {
- return ToUINT() == other.ToUINT();
+ return data_.cfFormat == other.data_.cfFormat;
}
// Various predefined FormatTypes.
@@ -348,27 +373,33 @@
return type;
}
-// Clipboard implementation.
-Clipboard::Clipboard() {
+// Clipboard factory method.
+// static
+Clipboard* Clipboard::Create() {
+ return new ClipboardWin;
+}
+
+// ClipboardWin implementation.
+ClipboardWin::ClipboardWin() {
if (base::MessageLoopForUI::IsCurrent())
clipboard_owner_.reset(new base::win::MessageWindow());
}
-Clipboard::~Clipboard() {
+ClipboardWin::~ClipboardWin() {
}
-uint64 Clipboard::GetSequenceNumber(ClipboardType type) {
+uint64 ClipboardWin::GetSequenceNumber(ClipboardType type) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
return ::GetClipboardSequenceNumber();
}
-bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
- ClipboardType type) const {
+bool ClipboardWin::IsFormatAvailable(const Clipboard::FormatType& format,
+ ClipboardType type) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
- return ::IsClipboardFormatAvailable(format.ToUINT()) != FALSE;
+ return ::IsClipboardFormatAvailable(format.ToFormatEtc().cfFormat) != FALSE;
}
-void Clipboard::Clear(ClipboardType type) {
+void ClipboardWin::Clear(ClipboardType type) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ScopedClipboard clipboard;
if (!clipboard.Acquire(GetClipboardWindow()))
@@ -377,20 +408,21 @@
::EmptyClipboard();
}
-void Clipboard::ReadAvailableTypes(ClipboardType type,
- std::vector<base::string16>* types,
- bool* contains_filenames) const {
+void ClipboardWin::ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const {
if (!types || !contains_filenames) {
NOTREACHED();
return;
}
types->clear();
- if (::IsClipboardFormatAvailable(GetPlainTextFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(
+ GetPlainTextFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeText));
- if (::IsClipboardFormatAvailable(GetHtmlFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(GetHtmlFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeHTML));
- if (::IsClipboardFormatAvailable(GetRtfFormatType().ToUINT()))
+ if (::IsClipboardFormatAvailable(GetRtfFormatType().ToFormatEtc().cfFormat))
types->push_back(base::UTF8ToUTF16(kMimeTypeRTF));
if (::IsClipboardFormatAvailable(CF_DIB))
types->push_back(base::UTF8ToUTF16(kMimeTypePNG));
@@ -401,7 +433,8 @@
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE hdata = ::GetClipboardData(GetWebCustomDataFormatType().ToUINT());
+ HANDLE hdata =
+ ::GetClipboardData(GetWebCustomDataFormatType().ToFormatEtc().cfFormat);
if (!hdata)
return;
@@ -409,7 +442,7 @@
::GlobalUnlock(hdata);
}
-void Clipboard::ReadText(ClipboardType type, base::string16* result) const {
+void ClipboardWin::ReadText(ClipboardType type, base::string16* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
if (!result) {
NOTREACHED();
@@ -431,7 +464,8 @@
::GlobalUnlock(data);
}
-void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const {
+void ClipboardWin::ReadAsciiText(ClipboardType type,
+ std::string* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
if (!result) {
NOTREACHED();
@@ -453,11 +487,11 @@
::GlobalUnlock(data);
}
-void Clipboard::ReadHTML(ClipboardType type,
- base::string16* markup,
- std::string* src_url,
- uint32* fragment_start,
- uint32* fragment_end) const {
+void ClipboardWin::ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
markup->clear();
@@ -473,7 +507,7 @@
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(GetHtmlFormatType().ToUINT());
+ HANDLE data = ::GetClipboardData(GetHtmlFormatType().ToFormatEtc().cfFormat);
if (!data)
return;
@@ -505,13 +539,13 @@
*fragment_end = base::checked_cast<uint32>(offsets[1]);
}
-void Clipboard::ReadRTF(ClipboardType type, std::string* result) const {
+void ClipboardWin::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ReadData(GetRtfFormatType(), result);
}
-SkBitmap Clipboard::ReadImage(ClipboardType type) const {
+SkBitmap ClipboardWin::ReadImage(ClipboardType type) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
// Acquire the clipboard.
@@ -581,9 +615,9 @@
return canvas.ExtractImageRep().sk_bitmap();
}
-void Clipboard::ReadCustomData(ClipboardType clipboard_type,
- const base::string16& type,
- base::string16* result) const {
+void ClipboardWin::ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const {
DCHECK_EQ(clipboard_type, CLIPBOARD_TYPE_COPY_PASTE);
// Acquire the clipboard.
@@ -591,7 +625,8 @@
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE hdata = ::GetClipboardData(GetWebCustomDataFormatType().ToUINT());
+ HANDLE hdata =
+ ::GetClipboardData(GetWebCustomDataFormatType().ToFormatEtc().cfFormat);
if (!hdata)
return;
@@ -599,7 +634,7 @@
::GlobalUnlock(hdata);
}
-void Clipboard::ReadBookmark(base::string16* title, std::string* url) const {
+void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const {
if (title)
title->clear();
@@ -611,7 +646,7 @@
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(GetUrlWFormatType().ToUINT());
+ HANDLE data = ::GetClipboardData(GetUrlWFormatType().ToFormatEtc().cfFormat);
if (!data)
return;
@@ -621,7 +656,8 @@
ParseBookmarkClipboardFormat(bookmark, title, url);
}
-void Clipboard::ReadData(const FormatType& format, std::string* result) const {
+void ClipboardWin::ReadData(const FormatType& format,
+ std::string* result) const {
if (!result) {
NOTREACHED();
return;
@@ -631,7 +667,7 @@
if (!clipboard.Acquire(GetClipboardWindow()))
return;
- HANDLE data = ::GetClipboardData(format.ToUINT());
+ HANDLE data = ::GetClipboardData(format.ToFormatEtc().cfFormat);
if (!data)
return;
@@ -640,26 +676,7 @@
::GlobalUnlock(data);
}
-// static
-void Clipboard::ParseBookmarkClipboardFormat(const base::string16& bookmark,
- base::string16* title,
- std::string* url) {
- const base::string16 kDelim = base::ASCIIToUTF16("\r\n");
-
- const size_t title_end = bookmark.find_first_of(kDelim);
- if (title)
- title->assign(bookmark.substr(0, title_end));
-
- if (url) {
- const size_t url_start = bookmark.find_first_not_of(kDelim, title_end);
- if (url_start != base::string16::npos) {
- *url = base::UTF16ToUTF8(
- bookmark.substr(url_start, base::string16::npos));
- }
- }
-}
-
-void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
+void ClipboardWin::WriteObjects(ClipboardType type, const ObjectMap& objects) {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ScopedClipboard clipboard;
@@ -668,13 +685,13 @@
::EmptyClipboard();
- for (ObjectMap::const_iterator iter = objects.begin();
- iter != objects.end(); ++iter) {
+ for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
+ ++iter) {
DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
}
}
-void Clipboard::WriteText(const char* text_data, size_t text_len) {
+void ClipboardWin::WriteText(const char* text_data, size_t text_len) {
base::string16 text;
base::UTF8ToUTF16(text_data, text_len, &text);
HGLOBAL glob = CreateGlobalData(text);
@@ -682,10 +699,10 @@
WriteToClipboard(CF_UNICODETEXT, glob);
}
-void Clipboard::WriteHTML(const char* markup_data,
- size_t markup_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardWin::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
std::string markup(markup_data, markup_len);
std::string url;
@@ -695,17 +712,17 @@
std::string html_fragment = ClipboardUtil::HtmlToCFHtml(markup, url);
HGLOBAL glob = CreateGlobalData(html_fragment);
- WriteToClipboard(Clipboard::GetHtmlFormatType().ToUINT(), glob);
+ WriteToClipboard(Clipboard::GetHtmlFormatType().ToFormatEtc().cfFormat, glob);
}
-void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+void ClipboardWin::WriteRTF(const char* rtf_data, size_t data_len) {
WriteData(GetRtfFormatType(), rtf_data, data_len);
}
-void Clipboard::WriteBookmark(const char* title_data,
- size_t title_len,
- const char* url_data,
- size_t url_len) {
+void ClipboardWin::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
std::string bookmark(title_data, title_len);
bookmark.append(1, L'\n');
bookmark.append(url_data, url_len);
@@ -713,15 +730,16 @@
base::string16 wide_bookmark = base::UTF8ToWide(bookmark);
HGLOBAL glob = CreateGlobalData(wide_bookmark);
- WriteToClipboard(GetUrlWFormatType().ToUINT(), glob);
+ WriteToClipboard(GetUrlWFormatType().ToFormatEtc().cfFormat, glob);
}
-void Clipboard::WriteWebSmartPaste() {
+void ClipboardWin::WriteWebSmartPaste() {
DCHECK(clipboard_owner_->hwnd() != NULL);
- ::SetClipboardData(GetWebKitSmartPasteFormatType().ToUINT(), NULL);
+ ::SetClipboardData(GetWebKitSmartPasteFormatType().ToFormatEtc().cfFormat,
+ NULL);
}
-void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+void ClipboardWin::WriteBitmap(const SkBitmap& bitmap) {
HDC dc = ::GetDC(NULL);
// This doesn't actually cost us a memcpy when the bitmap comes from the
@@ -740,7 +758,7 @@
// ::CreateDIBSection allocates memory for us to copy our bitmap into.
// Unfortunately, we can't write the created bitmap to the clipboard,
// (see http://msdn2.microsoft.com/en-us/library/ms532292.aspx)
- void *bits;
+ void* bits;
HBITMAP source_hbitmap =
::CreateDIBSection(dc, &bm_info, DIB_RGB_COLORS, &bits, NULL, 0);
@@ -760,8 +778,21 @@
::ReleaseDC(NULL, dc);
}
-void Clipboard::WriteBitmapFromHandle(HBITMAP source_hbitmap,
- const gfx::Size& size) {
+void ClipboardWin::WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) {
+ HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
+ if (!hdata)
+ return;
+
+ char* data = static_cast<char*>(::GlobalLock(hdata));
+ memcpy(data, data_data, data_len);
+ ::GlobalUnlock(data);
+ WriteToClipboard(format.ToFormatEtc().cfFormat, hdata);
+}
+
+void ClipboardWin::WriteBitmapFromHandle(HBITMAP source_hbitmap,
+ const gfx::Size& size) {
// We would like to just call ::SetClipboardData on the source_hbitmap,
// but that bitmap might not be of a sort we can write to the clipboard.
// For this reason, we create a new bitmap, copy the bits over, and then
@@ -786,8 +817,17 @@
// Now we need to blend it into an HBITMAP we can place on the clipboard
BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA};
- ::GdiAlphaBlend(compatible_dc, 0, 0, size.width(), size.height(),
- source_dc, 0, 0, size.width(), size.height(), bf);
+ ::GdiAlphaBlend(compatible_dc,
+ 0,
+ 0,
+ size.width(),
+ size.height(),
+ source_dc,
+ 0,
+ 0,
+ size.width(),
+ size.height(),
+ bf);
// Clean up all the handles we just opened
::SelectObject(compatible_dc, old_hbitmap);
@@ -801,20 +841,7 @@
WriteToClipboard(CF_BITMAP, hbitmap);
}
-void Clipboard::WriteData(const FormatType& format,
- const char* data_data,
- size_t data_len) {
- HGLOBAL hdata = ::GlobalAlloc(GMEM_MOVEABLE, data_len);
- if (!hdata)
- return;
-
- char* data = static_cast<char*>(::GlobalLock(hdata));
- memcpy(data, data_data, data_len);
- ::GlobalUnlock(data);
- WriteToClipboard(format.ToUINT(), hdata);
-}
-
-void Clipboard::WriteToClipboard(unsigned int format, HANDLE handle) {
+void ClipboardWin::WriteToClipboard(unsigned int format, HANDLE handle) {
DCHECK(clipboard_owner_->hwnd() != NULL);
if (handle && !::SetClipboardData(format, handle)) {
DCHECK(ERROR_CLIPBOARD_NOT_OPEN != GetLastError());
@@ -822,15 +849,7 @@
}
}
-// static
-void Clipboard::FreeData(unsigned int format, HANDLE data) {
- if (format == CF_BITMAP)
- ::DeleteObject(static_cast<HBITMAP>(data));
- else
- ::GlobalFree(data);
-}
-
-HWND Clipboard::GetClipboardWindow() const {
+HWND ClipboardWin::GetClipboardWindow() const {
if (!clipboard_owner_)
return NULL;
diff --git a/ui/base/clipboard/clipboard_win.h b/ui/base/clipboard/clipboard_win.h
new file mode 100644
index 0000000..a0769ff
--- /dev/null
+++ b/ui/base/clipboard/clipboard_win.h
@@ -0,0 +1,77 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_CLIPBOARD_CLIPBOARD_WIN_H_
+#define UI_BASE_CLIPBOARD_CLIPBOARD_WIN_H_
+
+#include "ui/base/clipboard/clipboard.h"
+
+#include "base/memory/scoped_ptr.h"
+
+namespace ui {
+
+class ClipboardWin : public Clipboard {
+ private:
+ friend class Clipboard;
+
+ ClipboardWin();
+ ~ClipboardWin() override;
+
+ // Clipboard overrides:
+ uint64 GetSequenceNumber(ClipboardType type) override;
+ bool IsFormatAvailable(const FormatType& format,
+ ClipboardType type) const override;
+ void Clear(ClipboardType type) override;
+ void ReadAvailableTypes(ClipboardType type,
+ std::vector<base::string16>* types,
+ bool* contains_filenames) const override;
+ void ReadText(ClipboardType type, base::string16* result) const override;
+ void ReadAsciiText(ClipboardType type, std::string* result) const override;
+ void ReadHTML(ClipboardType type,
+ base::string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const override;
+ void ReadRTF(ClipboardType type, std::string* result) const override;
+ SkBitmap ReadImage(ClipboardType type) const override;
+ void ReadCustomData(ClipboardType clipboard_type,
+ const base::string16& type,
+ base::string16* result) const override;
+ void ReadBookmark(base::string16* title, std::string* url) const override;
+ void ReadData(const FormatType& format, std::string* result) const override;
+ void WriteObjects(ClipboardType type, const ObjectMap& objects) override;
+ void WriteText(const char* text_data, size_t text_len) override;
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteRTF(const char* rtf_data, size_t data_len) override;
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) override;
+ void WriteWebSmartPaste() override;
+ void WriteBitmap(const SkBitmap& bitmap) override;
+ void WriteData(const FormatType& format,
+ const char* data_data,
+ size_t data_len) override;
+
+ void WriteBitmapFromHandle(HBITMAP source_hbitmap, const gfx::Size& size);
+
+ // Safely write to system clipboard. Free |handle| on failure.
+ void WriteToClipboard(unsigned int format, HANDLE handle);
+
+ // Return the window that should be the clipboard owner, creating it
+ // if neccessary. Marked const for lazily initialization by const methods.
+ HWND GetClipboardWindow() const;
+
+ // Mark this as mutable so const methods can still do lazy initialization.
+ mutable scoped_ptr<base::win::MessageWindow> clipboard_owner_;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardWin);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_CLIPBOARD_CLIPBOARD_WIN_H_
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp
index 0d7c90d..4655712 100644
--- a/ui/base/ui_base.gyp
+++ b/ui/base/ui_base.gyp
@@ -61,15 +61,19 @@
'clipboard/clipboard.cc',
'clipboard/clipboard.h',
'clipboard/clipboard_android.cc',
- 'clipboard/clipboard_android_initialization.h',
+ 'clipboard/clipboard_android.h',
'clipboard/clipboard_aura.cc',
+ 'clipboard/clipboard_aura.h',
'clipboard/clipboard_aurax11.cc',
+ 'clipboard/clipboard_aurax11.h',
'clipboard/clipboard_constants.cc',
+ 'clipboard/clipboard_mac.h',
'clipboard/clipboard_mac.mm',
'clipboard/clipboard_types.h',
'clipboard/clipboard_util_win.cc',
'clipboard/clipboard_util_win.h',
'clipboard/clipboard_win.cc',
+ 'clipboard/clipboard_win.h',
'clipboard/custom_data_helper.cc',
'clipboard/custom_data_helper.h',
'clipboard/custom_data_helper_linux.cc',
diff --git a/ui/file_manager/video_player/js/media_controls.js b/ui/file_manager/video_player/js/media_controls.js
index e246c83..238c763 100644
--- a/ui/file_manager/video_player/js/media_controls.js
+++ b/ui/file_manager/video_player/js/media_controls.js
@@ -1095,7 +1095,7 @@
this.toggleLoopedMode(on);
if (on) {
// TODO(mtomasz): Simplify, crbug.com/254318.
- this.showTextBanner_('GALLERY_VIDEO_LOOPED_MODE');
+ this.showTextBanner_('VIDEO_PLAYER_LOOPED_MODE');
}
};
diff --git a/ui/file_manager/video_player/js/video_player.js b/ui/file_manager/video_player/js/video_player.js
index 479d1eb..cd5dc02 100644
--- a/ui/file_manager/video_player/js/video_player.js
+++ b/ui/file_manager/video_player/js/video_player.js
@@ -111,10 +111,10 @@
if (this.casting)
this.showErrorMessage('VIDEO_PLAYER_VIDEO_FILE_UNSUPPORTED_FOR_CAST');
else
- this.showErrorMessage('GALLERY_VIDEO_ERROR');
+ this.showErrorMessage('VIDEO_PLAYER_VIDEO_FILE_UNSUPPORTED');
this.decodeErrorOccured = false;
} else {
- this.showErrorMessage('GALLERY_VIDEO_DECODING_ERROR');
+ this.showErrorMessage('VIDEO_PLAYER_PLAYBACK_ERROR');
this.decodeErrorOccured = true;
}
@@ -395,7 +395,8 @@
videoPlayerElement.removeAttribute('loading');
console.error('Failed to initialize the video element.',
error.stack || error);
- this.controls_.showErrorMessage('GALLERY_VIDEO_ERROR');
+ this.controls_.showErrorMessage(
+ 'VIDEO_PLAYER_VIDEO_FILE_UNSUPPORTED');
callback();
}.bind(this));
}.wrap(this));
@@ -613,7 +614,7 @@
this.currentSession_.removeUpdateListener(this.onCastSessionUpdateBound_);
this.currentSession_ = null;
}
- this.controls.showErrorMessage('GALLERY_VIDEO_DECODING_ERROR');
+ this.controls.showErrorMessage('VIDEO_PLAYER_PLAYBACK_ERROR');
this.unloadVideo();
};
diff --git a/ui/gfx/gpu_memory_buffer.h b/ui/gfx/gpu_memory_buffer.h
index e33a189..237bf47 100644
--- a/ui/gfx/gpu_memory_buffer.h
+++ b/ui/gfx/gpu_memory_buffer.h
@@ -21,7 +21,6 @@
EMPTY_BUFFER,
SHARED_MEMORY_BUFFER,
IO_SURFACE_BUFFER,
- ANDROID_NATIVE_BUFFER,
SURFACE_TEXTURE_BUFFER,
X11_PIXMAP_BUFFER,
OZONE_NATIVE_BUFFER,
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 303c01e..b135cac 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -1521,9 +1521,10 @@
# on the extension string or the GL version.
file.write("""void Driver%s::InitializeDynamicBindings(GLContext* context) {
DCHECK(context && context->IsCurrent(NULL));
- const GLVersionInfo* ver ALLOW_UNUSED = context->GetVersionInfo();
- std::string extensions ALLOW_UNUSED = context->GetExtensions();
- extensions += " ";
+ const GLVersionInfo* ver = context->GetVersionInfo();
+ ALLOW_UNUSED_LOCAL(ver);
+ std::string extensions = context->GetExtensions() + " ";
+ ALLOW_UNUSED_LOCAL(extensions);
""" % set_name.upper())
for extension in sorted(used_extensions):
diff --git a/ui/gl/gl_surface_mac.cc b/ui/gl/gl_surface_mac.cc
index dec5a9a..d5a66f1 100644
--- a/ui/gl/gl_surface_mac.cc
+++ b/ui/gl/gl_surface_mac.cc
@@ -40,6 +40,7 @@
virtual gfx::Size GetSize() override { return size_; }
virtual void* GetHandle() override { return NULL; }
virtual void* GetDisplay() override { return NULL; }
+ virtual bool IsSurfaceless() const override { return true; }
protected:
virtual ~NoOpGLSurface() {}
diff --git a/ui/login/screen_container.css b/ui/login/screen_container.css
index 54fc5ef..40d4004 100644
--- a/ui/login/screen_container.css
+++ b/ui/login/screen_container.css
@@ -165,7 +165,9 @@
opacity: 1;
}
-#oobe.reset #progress-dots {
+#oobe.reset #progress-dots,
+#oobe.host-pairing #progress-dots,
+#oobe.controller-pairing #progress-dots {
visibility: hidden;
}
diff --git a/ui/message_center/notifier_settings.h b/ui/message_center/notifier_settings.h
index 3e4af89..68ec9fd 100644
--- a/ui/message_center/notifier_settings.h
+++ b/ui/message_center/notifier_settings.h
@@ -13,7 +13,9 @@
#include "ui/message_center/message_center_export.h"
#include "url/gurl.h"
+class MessageCenterNotificationsTest;
class MessageCenterTrayBridgeTest;
+class StubNotificationUIManager;
namespace ash {
class WebNotificationTrayTest;
@@ -24,6 +26,7 @@
class MessagePopupCollectionTest;
}
+class MessageCenterNotificationManagerTest;
class NotifierSettingsDelegate;
class NotifierSettingsProvider;
@@ -65,13 +68,16 @@
std::string profile_id;
private:
- friend class ::MessageCenterTrayBridgeTest;
+ friend class MessageCenterNotificationManagerTest;
friend class MessageCenterTrayTest;
- friend class test::MessagePopupCollectionTest;
friend class NotificationControllerTest;
friend class PopupCollectionTest;
friend class TrayViewControllerTest;
+ friend class ::MessageCenterNotificationsTest;
+ friend class ::MessageCenterTrayBridgeTest;
+ friend class ::StubNotificationUIManager;
friend class ash::WebNotificationTrayTest;
+ friend class test::MessagePopupCollectionTest;
FRIEND_TEST_ALL_PREFIXES(PopupControllerTest, Creation);
FRIEND_TEST_ALL_PREFIXES(NotificationListTest, UnreadCountNoNegative);
FRIEND_TEST_ALL_PREFIXES(NotificationListTest, TestHasNotificationOfType);
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm
index 60c049c..6b87f57 100644
--- a/ui/native_theme/native_theme_mac.mm
+++ b/ui/native_theme/native_theme_mac.mm
@@ -97,15 +97,17 @@
// windowBackgroundColor; need to first convert colorspace." Hence the
// conversion first to CGColor.
CGColorRef cg_color = [color CGColor];
- if (CGColorGetNumberOfComponents(cg_color) == 4)
+ const size_t component_count = CGColorGetNumberOfComponents(cg_color);
+ if (component_count == 4)
return gfx::CGColorRefToSkColor(cg_color);
- CHECK_EQ(2u, CGColorGetNumberOfComponents(cg_color));
- // Two components means a grayscale channel and an alpha channel, which
+ CHECK(component_count == 1 || component_count == 2);
+ // 1-2 components means a grayscale channel and maybe an alpha channel, which
// CGColorRefToSkColor will not like. But RGB is additive, so the conversion
// is easy (RGB to grayscale is less easy).
const CGFloat* components = CGColorGetComponents(cg_color);
- return SkColorSetARGB(SkScalarRoundToInt(255.0 * components[1]),
+ CGFloat alpha = component_count == 2 ? components[1] : 1.0;
+ return SkColorSetARGB(SkScalarRoundToInt(255.0 * alpha),
SkScalarRoundToInt(255.0 * components[0]),
SkScalarRoundToInt(255.0 * components[0]),
SkScalarRoundToInt(255.0 * components[0]));
diff --git a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc
index c9bee4c..ce1f9ca 100644
--- a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc
+++ b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "ui/gl/gl_image_egl.h"
+#include "ui/gl/gl_image_linux_dma_buffer.h"
#include "ui/ozone/public/native_pixmap.h"
#include "ui/ozone/public/surface_factory_ozone.h"
#include "ui/ozone/public/surface_ozone_egl.h"
@@ -16,7 +17,7 @@
public:
explicit GLImageOzoneNativePixmap(const gfx::Size& size) : GLImageEGL(size) {}
- bool Initialize(scoped_refptr<NativePixmap> pixmap) {
+ bool Initialize(NativePixmap* pixmap) {
EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
if (!Initialize(EGL_NATIVE_PIXMAP_KHR, pixmap->GetEGLClientBuffer(), attrs))
return false;
@@ -41,6 +42,38 @@
scoped_refptr<NativePixmap> pixmap_;
};
+class GLImageOzoneNativePixmapDmaBuf : public gfx::GLImageLinuxDMABuffer {
+ public:
+ explicit GLImageOzoneNativePixmapDmaBuf(const gfx::Size& size,
+ unsigned internalformat)
+ : GLImageLinuxDMABuffer(size, internalformat) {}
+
+ bool Initialize(NativePixmap* pixmap,
+ gfx::GpuMemoryBuffer::Format format) {
+ base::FileDescriptor handle(pixmap->GetDmaBufFd(), false);
+ if (!GLImageLinuxDMABuffer::Initialize(
+ handle, format, pixmap->GetDmaBufPitch()))
+ return false;
+ pixmap_ = pixmap;
+ return true;
+ }
+
+ virtual bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
+ int z_order,
+ gfx::OverlayTransform transform,
+ const gfx::Rect& bounds_rect,
+ const gfx::RectF& crop_rect) override {
+ return SurfaceFactoryOzone::GetInstance()->ScheduleOverlayPlane(
+ widget, z_order, transform, pixmap_, bounds_rect, crop_rect);
+ }
+
+ protected:
+ virtual ~GLImageOzoneNativePixmapDmaBuf() {}
+
+ private:
+ scoped_refptr<NativePixmap> pixmap_;
+};
+
SurfaceFactoryOzone::BufferFormat GetOzoneFormatFor(
gfx::GpuMemoryBuffer::Format format) {
switch (format) {
@@ -96,17 +129,31 @@
GpuMemoryBufferFactoryOzoneNativeBuffer::CreateImageForGpuMemoryBuffer(
const gfx::GpuMemoryBufferId& id,
const gfx::Size& size,
+ gfx::GpuMemoryBuffer::Format format,
unsigned internalformat) {
BufferToPixmapMap::iterator it = native_pixmap_map_.find(GetIndex(id));
if (it == native_pixmap_map_.end()) {
return scoped_refptr<gfx::GLImage>();
}
- scoped_refptr<GLImageOzoneNativePixmap> image =
- new GLImageOzoneNativePixmap(size);
- if (!image->Initialize(it->second)) {
- return scoped_refptr<gfx::GLImage>();
+ NativePixmap* pixmap = it->second.get();
+ if (pixmap->GetEGLClientBuffer()) {
+ DCHECK_EQ(-1, pixmap->GetDmaBufFd());
+ scoped_refptr<GLImageOzoneNativePixmap> image =
+ new GLImageOzoneNativePixmap(size);
+ if (!image->Initialize(pixmap)) {
+ return scoped_refptr<gfx::GLImage>();
+ }
+ return image;
}
- return image;
+ if (pixmap->GetDmaBufFd() > 0) {
+ scoped_refptr<GLImageOzoneNativePixmapDmaBuf> image =
+ new GLImageOzoneNativePixmapDmaBuf(size, internalformat);
+ if (!image->Initialize(pixmap, format)) {
+ return scoped_refptr<gfx::GLImage>();
+ }
+ return image;
+ }
+ return scoped_refptr<gfx::GLImage>();
}
} // namespace ui
diff --git a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h
index b35487f..c65ce04 100644
--- a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h
+++ b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h
@@ -40,6 +40,7 @@
scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer(
const gfx::GpuMemoryBufferId& id,
const gfx::Size& size,
+ gfx::GpuMemoryBuffer::Format format,
unsigned internalformat);
private:
diff --git a/ui/ozone/platform/dri/gbm_buffer.cc b/ui/ozone/platform/dri/gbm_buffer.cc
index 398064d..030dc3b 100644
--- a/ui/ozone/platform/dri/gbm_buffer.cc
+++ b/ui/ozone/platform/dri/gbm_buffer.cc
@@ -71,7 +71,10 @@
}
int GbmPixmap::GetDmaBufFd() {
- NOTIMPLEMENTED();
+ return -1;
+}
+
+int GbmPixmap::GetDmaBufPitch() {
return -1;
}
diff --git a/ui/ozone/platform/dri/gbm_buffer.h b/ui/ozone/platform/dri/gbm_buffer.h
index 3451510..3fad2c5 100644
--- a/ui/ozone/platform/dri/gbm_buffer.h
+++ b/ui/ozone/platform/dri/gbm_buffer.h
@@ -42,6 +42,7 @@
// NativePixmap:
virtual void* GetEGLClientBuffer() override;
virtual int GetDmaBufFd() override;
+ virtual int GetDmaBufPitch() override;
scoped_refptr<GbmBuffer> buffer() { return buffer_; }
diff --git a/ui/ozone/public/native_pixmap.h b/ui/ozone/public/native_pixmap.h
index db7a6c8..8342ca2 100644
--- a/ui/ozone/public/native_pixmap.h
+++ b/ui/ozone/public/native_pixmap.h
@@ -17,6 +17,7 @@
virtual void* /* EGLClientBuffer */ GetEGLClientBuffer() = 0;
virtual int GetDmaBufFd() = 0;
+ virtual int GetDmaBufPitch() = 0;
protected:
virtual ~NativePixmap() {}
diff --git a/ui/views/cocoa/bridged_content_view.h b/ui/views/cocoa/bridged_content_view.h
index 2bc93ab..3a917cf 100644
--- a/ui/views/cocoa/bridged_content_view.h
+++ b/ui/views/cocoa/bridged_content_view.h
@@ -31,10 +31,16 @@
// A tracking area installed to enable mouseMoved events.
ui::ScopedCrTrackingArea trackingArea_;
+
+ // Set to ignore window visibility in a subsequent call to drawRect:. Views
+ // does not expect hidden windows to paint. However, when showing a window,
+ // Cocoa first paints before updating visibility.
+ BOOL willShow_;
}
@property(readonly, nonatomic) views::View* hostedView;
@property(assign, nonatomic) ui::TextInputClient* textInputClient;
+@property(assign, nonatomic) BOOL willShow;
// Initialize the NSView -> views::View bridge. |viewToHost| must be non-NULL.
- (id)initWithView:(views::View*)viewToHost;
diff --git a/ui/views/cocoa/bridged_content_view.mm b/ui/views/cocoa/bridged_content_view.mm
index 66624a1..3a77207 100644
--- a/ui/views/cocoa/bridged_content_view.mm
+++ b/ui/views/cocoa/bridged_content_view.mm
@@ -30,6 +30,7 @@
@synthesize hostedView = hostedView_;
@synthesize textInputClient = textInputClient_;
+@synthesize willShow = willShow_;
- (id)initWithView:(views::View*)viewToHost {
DCHECK(viewToHost);
@@ -89,11 +90,13 @@
}
- (void)drawRect:(NSRect)dirtyRect {
- if (!hostedView_)
+ // Note that on a Show, Cocoa calls drawRect: before changing
+ // -[NSWindow isVisible], hence the extra check.
+ if (!hostedView_ || (!willShow_ && ![[self window] isVisible]))
return;
gfx::CanvasSkiaPaint canvas(dirtyRect, false /* opaque */);
- hostedView_->Paint(&canvas, views::CullSet());
+ hostedView_->GetWidget()->OnNativeWidgetPaint(&canvas);
}
// NSResponder implementation.
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index bd72331..fb4c679 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -20,6 +20,7 @@
#include "ui/views/ime/input_method.h"
#include "ui/views/view.h"
#include "ui/views/widget/native_widget_mac.h"
+#include "ui/views/widget/root_view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
@@ -223,7 +224,6 @@
virtual void TearDown() override;
protected:
- // TODO(tapted): Make this a EventCountView from widget_unittest.cc.
scoped_ptr<views::View> view_;
scoped_ptr<BridgedNativeWidget> bridge_;
BridgedContentView* ns_view_; // Weak. Owned by bridge_.
@@ -255,7 +255,7 @@
void BridgedNativeWidgetTest::SetUp() {
BridgedNativeWidgetTestBase::SetUp();
- view_.reset(new views::View);
+ view_.reset(new views::internal::RootView(widget_.get()));
base::scoped_nsobject<NSWindow> window([test_window() retain]);
// BridgedNativeWidget expects to be initialized with a hidden (deferred)
diff --git a/ui/views/cocoa/views_nswindow_delegate.h b/ui/views/cocoa/views_nswindow_delegate.h
index 799cb80..2f1104c 100644
--- a/ui/views/cocoa/views_nswindow_delegate.h
+++ b/ui/views/cocoa/views_nswindow_delegate.h
@@ -26,6 +26,16 @@
// Initialize with the given |parent|.
- (id)initWithBridgedNativeWidget:(views::BridgedNativeWidget*)parent;
+// Notify that the window is about to be reordered on screen. This ensures a
+// paint will occur, even if Cocoa has not yet updated the window visibility.
+- (void)onWindowOrderWillChange:(NSWindowOrderingMode)orderingMode;
+
+// Notify that the window has been reordered in (or removed from) the window
+// server's screen list. This is a substitute for -[NSWindowDelegate
+// windowDidExpose:], which is only sent for nonretained windows (those without
+// a backing store).
+- (void)onWindowOrderChanged;
+
@end
#endif // UI_VIEWS_COCOA_VIEWS_NSWINDOW_DELEGATE_H_
diff --git a/ui/views/cocoa/views_nswindow_delegate.mm b/ui/views/cocoa/views_nswindow_delegate.mm
index 50f0021..038a844 100644
--- a/ui/views/cocoa/views_nswindow_delegate.mm
+++ b/ui/views/cocoa/views_nswindow_delegate.mm
@@ -5,6 +5,7 @@
#import "ui/views/cocoa/views_nswindow_delegate.h"
#include "base/logging.h"
+#import "ui/views/cocoa/bridged_content_view.h"
#import "ui/views/cocoa/bridged_native_widget.h"
#include "ui/views/widget/native_widget_mac.h"
@@ -22,6 +23,15 @@
return parent_->native_widget_mac();
}
+- (void)onWindowOrderWillChange:(NSWindowOrderingMode)orderingMode {
+ if (orderingMode != NSWindowOut)
+ [parent_->ns_view() setWillShow:YES];
+}
+
+- (void)onWindowOrderChanged {
+ [parent_->ns_view() setWillShow:NO];
+}
+
// NSWindowDelegate implementation.
- (void)windowDidFailToEnterFullScreen:(NSWindow*)window {
diff --git a/ui/views/focus/focus_manager.h b/ui/views/focus/focus_manager.h
index bb62085..bce8549 100644
--- a/ui/views/focus/focus_manager.h
+++ b/ui/views/focus/focus_manager.h
@@ -82,7 +82,6 @@
class FocusManagerDelegate;
class FocusSearch;
-class RootView;
class View;
class Widget;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index c6d851d..b6aa717 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -18,10 +18,15 @@
#include "ui/views/window/native_frame_view.h"
@interface NativeWidgetMacNSWindow : NSWindow
+- (ViewsNSWindowDelegate*)viewsNSWindowDelegate;
@end
@implementation NativeWidgetMacNSWindow
+- (ViewsNSWindowDelegate*)viewsNSWindowDelegate {
+ return base::mac::ObjCCastStrict<ViewsNSWindowDelegate>([self delegate]);
+}
+
// Override canBecome{Key,Main}Window to always return YES, otherwise Windows
// with a styleMask of NSBorderlessWindowMask default to NO.
- (BOOL)canBecomeKeyWindow {
@@ -32,6 +37,15 @@
return YES;
}
+// Override orderWindow to intercept visibility changes, since there is no way
+// to observe these changes via NSWindowDelegate.
+- (void)orderWindow:(NSWindowOrderingMode)orderingMode
+ relativeTo:(NSInteger)otherWindowNumber {
+ [[self viewsNSWindowDelegate] onWindowOrderWillChange:orderingMode];
+ [super orderWindow:orderingMode relativeTo:otherWindowNumber];
+ [[self viewsNSWindowDelegate] onWindowOrderChanged];
+}
+
@end
namespace views {
@@ -301,6 +315,12 @@
}
void NativeWidgetMac::Close() {
+ if (!bridge_)
+ return;
+
+ // Clear the view early to suppress repaints.
+ bridge_->SetRootView(NULL);
+
NSWindow* window = GetNativeWindow();
// Calling performClose: will momentarily highlight the close button, but
// AppKit will reject it if there is no close button.
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 12e3cc1..374435f 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -1125,12 +1125,13 @@
class DesktopAuraTestValidPaintWidget : public views::Widget {
public:
DesktopAuraTestValidPaintWidget()
- : expect_paint_(true),
- received_paint_while_hidden_(false) {
- }
+ : received_paint_(false),
+ expect_paint_(true),
+ received_paint_while_hidden_(false) {}
- virtual ~DesktopAuraTestValidPaintWidget() {
- }
+ virtual ~DesktopAuraTestValidPaintWidget() {}
+
+ void InitForTest(Widget::InitParams create_params);
virtual void Show() override {
expect_paint_ = true;
@@ -1148,58 +1149,66 @@
}
virtual void OnNativeWidgetPaint(gfx::Canvas* canvas) override {
+ received_paint_ = true;
EXPECT_TRUE(expect_paint_);
if (!expect_paint_)
received_paint_while_hidden_ = true;
views::Widget::OnNativeWidgetPaint(canvas);
}
+ bool ReadReceivedPaintAndReset() {
+ bool result = received_paint_;
+ received_paint_ = false;
+ return result;
+ }
+
bool received_paint_while_hidden() const {
return received_paint_while_hidden_;
}
private:
+ bool received_paint_;
bool expect_paint_;
bool received_paint_while_hidden_;
+
+ DISALLOW_COPY_AND_ASSIGN(DesktopAuraTestValidPaintWidget);
};
-TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) {
+void DesktopAuraTestValidPaintWidget::InitForTest(InitParams init_params) {
+ init_params.bounds = gfx::Rect(0, 0, 200, 200);
+ init_params.ownership = InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ init_params.native_widget = new PlatformDesktopNativeWidget(this);
+ Init(init_params);
+
View* contents_view = new View;
contents_view->SetFocusable(true);
+ SetContentsView(contents_view);
+
+ Show();
+ Activate();
+}
+
+TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterCloseTest) {
DesktopAuraTestValidPaintWidget widget;
- Widget::InitParams init_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- init_params.bounds = gfx::Rect(0, 0, 200, 200);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
- widget.Init(init_params);
- widget.SetContentsView(contents_view);
- widget.Show();
- widget.Activate();
+ widget.InitForTest(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS));
RunPendingMessages();
- widget.SchedulePaintInRect(init_params.bounds);
+ EXPECT_TRUE(widget.ReadReceivedPaintAndReset());
+ widget.SchedulePaintInRect(widget.GetRestoredBounds());
widget.Close();
RunPendingMessages();
+ EXPECT_FALSE(widget.ReadReceivedPaintAndReset());
EXPECT_FALSE(widget.received_paint_while_hidden());
}
TEST_F(WidgetTest, DesktopNativeWidgetNoPaintAfterHideTest) {
- View* contents_view = new View;
- contents_view->SetFocusable(true);
DesktopAuraTestValidPaintWidget widget;
- Widget::InitParams init_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
- init_params.bounds = gfx::Rect(0, 0, 200, 200);
- init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- init_params.native_widget = new PlatformDesktopNativeWidget(&widget);
- widget.Init(init_params);
- widget.SetContentsView(contents_view);
- widget.Show();
- widget.Activate();
+ widget.InitForTest(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS));
RunPendingMessages();
- widget.SchedulePaintInRect(init_params.bounds);
+ EXPECT_TRUE(widget.ReadReceivedPaintAndReset());
+ widget.SchedulePaintInRect(widget.GetRestoredBounds());
widget.Hide();
RunPendingMessages();
+ EXPECT_FALSE(widget.ReadReceivedPaintAndReset());
EXPECT_FALSE(widget.received_paint_while_hidden());
widget.Close();
}
@@ -1221,6 +1230,8 @@
NonClientFrameView* frame_view = new MinimumSizeFrameView(&widget);
non_client_view->SetFrameView(frame_view);
+ widget.Show();
+ EXPECT_TRUE(IsNativeWindowVisible(widget.GetNativeWindow()));
widget.Hide();
EXPECT_FALSE(IsNativeWindowVisible(widget.GetNativeWindow()));
widget.Show();