diff --git a/base/syslog_logging.cc b/base/syslog_logging.cc
deleted file mode 100644
index 03c2b5e..0000000
--- a/base/syslog_logging.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/syslog_logging.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/debug/stack_trace.h"
-#elif defined(OS_LINUX)
-// <syslog.h> defines a LOG_WARNING macro that could conflict with
-// base::LOG_WARNING.
-#include <syslog.h>
-#undef LOG_WARNING
-#endif
-
-#include <ostream>
-#include <string>
-
-namespace logging {
-
-#if defined(OS_WIN)
-
-namespace {
-
-std::string* g_event_source_name = nullptr;
-uint16_t g_category = 0;
-uint32_t g_event_id = 0;
-
-}  // namespace
-
-void SetEventSource(const std::string& name,
-                    uint16_t category,
-                    uint32_t event_id) {
-  DCHECK_EQ(nullptr, g_event_source_name);
-  g_event_source_name = new std::string(name);
-  g_category = category;
-  g_event_id = event_id;
-}
-
-#endif  // defined(OS_WIN)
-
-EventLogMessage::EventLogMessage(const char* file,
-                                 int line,
-                                 LogSeverity severity)
-    : log_message_(file, line, severity) {
-}
-
-EventLogMessage::~EventLogMessage() {
-#if defined(OS_WIN)
-  // If g_event_source_name is nullptr (which it is per default) SYSLOG will
-  // degrade gracefully to regular LOG. If you see this happening most probably
-  // you are using SYSLOG before you called SetEventSourceName.
-  if (g_event_source_name == nullptr)
-    return;
-
-  HANDLE event_log_handle =
-      RegisterEventSourceA(nullptr, g_event_source_name->c_str());
-  if (event_log_handle == nullptr) {
-    stream() << " !!NOT ADDED TO EVENTLOG!!";
-    return;
-  }
-
-  base::ScopedClosureRunner auto_deregister(
-      base::Bind(base::IgnoreResult(&DeregisterEventSource), event_log_handle));
-  std::string message(log_message_.str());
-  WORD log_type = EVENTLOG_ERROR_TYPE;
-  switch (log_message_.severity()) {
-    case LOG_INFO:
-      log_type = EVENTLOG_INFORMATION_TYPE;
-      break;
-    case LOG_WARNING:
-      log_type = EVENTLOG_WARNING_TYPE;
-      break;
-    case LOG_ERROR:
-    case LOG_FATAL:
-      // The price of getting the stack trace is not worth the hassle for
-      // non-error conditions.
-      base::debug::StackTrace trace;
-      message.append(trace.ToString());
-      log_type = EVENTLOG_ERROR_TYPE;
-      break;
-  }
-  LPCSTR strings[1] = {message.data()};
-  if (!ReportEventA(event_log_handle, log_type, g_category, g_event_id, nullptr,
-                    1, 0, strings, nullptr)) {
-    stream() << " !!NOT ADDED TO EVENTLOG!!";
-  }
-#elif defined(OS_LINUX)
-  const char kEventSource[] = "chrome";
-  openlog(kEventSource, LOG_NOWAIT | LOG_PID, LOG_USER);
-  // We can't use the defined names for the logging severity from syslog.h
-  // because they collide with the names of our own severity levels. Therefore
-  // we use the actual values which of course do not match ours.
-  // See sys/syslog.h for reference.
-  int priority = 3;
-  switch (log_message_.severity()) {
-    case LOG_INFO:
-      priority = 6;
-      break;
-    case LOG_WARNING:
-      priority = 4;
-      break;
-    case LOG_ERROR:
-      priority = 3;
-      break;
-    case LOG_FATAL:
-      priority = 2;
-      break;
-  }
-  syslog(priority, "%s", log_message_.str().c_str());
-  closelog();
-#endif  // defined(OS_WIN)
-}
-
-}  // namespace logging
diff --git a/base/syslog_logging.h b/base/syslog_logging.h
deleted file mode 100644
index 2c2ff55..0000000
--- a/base/syslog_logging.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_SYSLOG_LOGGING_H_
-#define BASE_SYSLOG_LOGGING_H_
-
-#include <iosfwd>
-
-#include "base/logging.h"
-#include "build_config.h"
-
-namespace logging {
-
-// Keep in mind that the syslog is always active regardless of the logging level
-// and applied flags. Use only for important information that a system
-// administrator might need to maintain the browser installation.
-#define SYSLOG_STREAM(severity) \
-  COMPACT_GOOGLE_LOG_EX_ ## severity(EventLogMessage).stream()
-#define SYSLOG(severity) \
-  SYSLOG_STREAM(severity)
-
-#if defined(OS_WIN)
-// Sets the name, category and event id of the event source for logging to the
-// Windows Event Log. Call this function once before using the SYSLOG macro or
-// otherwise it will behave as a regular LOG macro.
-void BASE_EXPORT SetEventSource(const std::string& name,
-                                uint16_t category,
-                                uint32_t event_id);
-#endif  // defined(OS_WIN)
-
-// Creates a formatted message on the system event log. That would be the
-// Application Event log on Windows and the messages log file on POSIX systems.
-class BASE_EXPORT EventLogMessage {
- public:
-  EventLogMessage(const char* file, int line, LogSeverity severity);
-
-  ~EventLogMessage();
-
-  std::ostream& stream() { return log_message_.stream(); }
-
- private:
-  LogMessage log_message_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventLogMessage);
-};
-
-}  // namespace logging
-
-#endif  // BASE_SYSLOG_LOGGING_H_
diff --git a/base/unguessable_token.cc b/base/unguessable_token.cc
deleted file mode 100644
index 0d8aad3..0000000
--- a/base/unguessable_token.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/unguessable_token.h"
-
-#include "base/format_macros.h"
-#include "base/rand_util.h"
-#include "base/strings/stringprintf.h"
-
-namespace base {
-
-UnguessableToken::UnguessableToken(uint64_t high, uint64_t low)
-    : high_(high), low_(low) {}
-
-std::string UnguessableToken::ToString() const {
-  return base::StringPrintf("%016" PRIX64 "%016" PRIX64, high_, low_);
-}
-
-// static
-UnguessableToken UnguessableToken::Create() {
-  UnguessableToken token;
-  // Use base::RandBytes instead of crypto::RandBytes, because crypto calls the
-  // base version directly, and to prevent the dependency from base/ to crypto/.
-  base::RandBytes(&token, sizeof(token));
-  return token;
-}
-
-// static
-UnguessableToken UnguessableToken::Deserialize(uint64_t high, uint64_t low) {
-  // Receiving a zeroed out UnguessableToken from another process means that it
-  // was never initialized via Create(). Treat this case as a security issue.
-  DCHECK(!(high == 0 && low == 0));
-  return UnguessableToken(high, low);
-}
-
-std::ostream& operator<<(std::ostream& out, const UnguessableToken& token) {
-  return out << "(" << token.ToString() << ")";
-}
-
-}  // namespace base
diff --git a/base/unguessable_token.h b/base/unguessable_token.h
deleted file mode 100644
index 6858e22..0000000
--- a/base/unguessable_token.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_UNGUESSABLE_TOKEN_H_
-#define BASE_UNGUESSABLE_TOKEN_H_
-
-#include <stdint.h>
-#include <string.h>
-#include <iosfwd>
-#include <tuple>
-
-#include "base/base_export.h"
-#include "base/hash.h"
-#include "base/logging.h"
-
-namespace base {
-
-struct UnguessableTokenHash;
-
-// A UnguessableToken is an 128-bit token generated from a cryptographically
-// strong random source. It can be used as part of a larger aggregate type,
-// or as an ID in and of itself.
-//
-// UnguessableToken can be used to implement "Capability-Based Security".
-// In other words, UnguessableToken can be used when the resource associated
-// with the ID needs to be protected against manipulation by other untrusted
-// agents in the system, and there is no other convenient way to verify the
-// authority of the agent to do so (because the resource is part of a table
-// shared across processes, for instance). In such a scheme, knowledge of the
-// token value in and of itself is sufficient proof of authority to carry out
-// an operation against the associated resource.
-//
-// Use Create() for creating new UnguessableTokens.
-//
-// NOTE: It is illegal to send empty UnguessableTokens across processes, and
-// sending/receiving empty tokens should be treated as a security issue.
-// If there is a valid scenario for sending "no token" across processes,
-// base::Optional should be used instead of an empty token.
-class BASE_EXPORT UnguessableToken {
- public:
-  // Create a unique UnguessableToken.
-  static UnguessableToken Create();
-
-  // Return a UnguessableToken built from the high/low bytes provided.
-  // It should only be used in deserialization scenarios.
-  //
-  // NOTE: If the deserialized token is empty, it means that it was never
-  // initialized via Create(). This is a security issue, and should be handled.
-  static UnguessableToken Deserialize(uint64_t high, uint64_t low);
-
-  // Creates an empty UnguessableToken.
-  // Assign to it with Create() before using it.
-  constexpr UnguessableToken() = default;
-
-  // NOTE: Serializing an empty UnguessableToken is an illegal operation.
-  uint64_t GetHighForSerialization() const {
-    DCHECK(!is_empty());
-    return high_;
-  }
-
-  // NOTE: Serializing an empty UnguessableToken is an illegal operation.
-  uint64_t GetLowForSerialization() const {
-    DCHECK(!is_empty());
-    return low_;
-  }
-
-  bool is_empty() const { return high_ == 0 && low_ == 0; }
-
-  // Hex representation of the unguessable token.
-  std::string ToString() const;
-
-  explicit operator bool() const { return !is_empty(); }
-
-  bool operator<(const UnguessableToken& other) const {
-    return std::tie(high_, low_) < std::tie(other.high_, other.low_);
-  }
-
-  bool operator==(const UnguessableToken& other) const {
-    return high_ == other.high_ && low_ == other.low_;
-  }
-
-  bool operator!=(const UnguessableToken& other) const {
-    return !(*this == other);
-  }
-
- private:
-  friend struct UnguessableTokenHash;
-  UnguessableToken(uint64_t high, uint64_t low);
-
-  // Note: Two uint64_t are used instead of uint8_t[16], in order to have a
-  // simpler ToString() and is_empty().
-  uint64_t high_ = 0;
-  uint64_t low_ = 0;
-};
-
-BASE_EXPORT std::ostream& operator<<(std::ostream& out,
-                                     const UnguessableToken& token);
-
-// For use in std::unordered_map.
-struct UnguessableTokenHash {
-  size_t operator()(const base::UnguessableToken& token) const {
-    DCHECK(token);
-    return base::HashInts64(token.high_, token.low_);
-  }
-};
-
-}  // namespace base
-
-#endif  // BASE_UNGUESSABLE_TOKEN_H_
diff --git a/base/value_conversions.cc b/base/value_conversions.cc
deleted file mode 100644
index 7e3fd94..0000000
--- a/base/value_conversions.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/value_conversions.h"
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "base/values.h"
-
-namespace base {
-namespace {
-// Helper for serialize/deserialize UnguessableToken.
-union UnguessableTokenRepresentation {
-  struct Field {
-    uint64_t high;
-    uint64_t low;
-  } field;
-
-  uint8_t buffer[sizeof(Field)];
-};
-}  // namespace
-
-// |Value| internally stores strings in UTF-8, so we have to convert from the
-// system native code to UTF-8 and back.
-std::unique_ptr<Value> CreateFilePathValue(const FilePath& in_value) {
-  return std::make_unique<Value>(in_value.AsUTF8Unsafe());
-}
-
-bool GetValueAsFilePath(const Value& value, FilePath* file_path) {
-  std::string str;
-  if (!value.GetAsString(&str))
-    return false;
-  if (file_path)
-    *file_path = FilePath::FromUTF8Unsafe(str);
-  return true;
-}
-
-// |Value| does not support 64-bit integers, and doubles do not have enough
-// precision, so we store the 64-bit time value as a string instead.
-std::unique_ptr<Value> CreateTimeDeltaValue(const TimeDelta& time) {
-  std::string string_value = base::Int64ToString(time.ToInternalValue());
-  return std::make_unique<Value>(string_value);
-}
-
-bool GetValueAsTimeDelta(const Value& value, TimeDelta* time) {
-  std::string str;
-  int64_t int_value;
-  if (!value.GetAsString(&str) || !base::StringToInt64(str, &int_value))
-    return false;
-  if (time)
-    *time = TimeDelta::FromInternalValue(int_value);
-  return true;
-}
-
-std::unique_ptr<Value> CreateUnguessableTokenValue(
-    const UnguessableToken& token) {
-  UnguessableTokenRepresentation representation;
-  representation.field.high = token.GetHighForSerialization();
-  representation.field.low = token.GetLowForSerialization();
-
-  return std::make_unique<Value>(
-      HexEncode(representation.buffer, sizeof(representation.buffer)));
-}
-
-bool GetValueAsUnguessableToken(const Value& value, UnguessableToken* token) {
-  if (!value.is_string()) {
-    return false;
-  }
-
-  // TODO(dcheng|yucliu): Make a function that accepts non vector variant and
-  // reads a fixed number of bytes.
-  std::vector<uint8_t> high_low_bytes;
-  if (!HexStringToBytes(value.GetString(), &high_low_bytes)) {
-    return false;
-  }
-
-  UnguessableTokenRepresentation representation;
-  if (high_low_bytes.size() != sizeof(representation.buffer)) {
-    return false;
-  }
-
-  std::copy(high_low_bytes.begin(), high_low_bytes.end(),
-            std::begin(representation.buffer));
-  *token = UnguessableToken::Deserialize(representation.field.high,
-                                         representation.field.low);
-  return true;
-}
-
-}  // namespace base
diff --git a/base/value_conversions.h b/base/value_conversions.h
deleted file mode 100644
index bd095cd..0000000
--- a/base/value_conversions.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_VALUE_CONVERSIONS_H_
-#define BASE_VALUE_CONVERSIONS_H_
-
-// This file contains methods to convert things to a |Value| and back.
-
-#include <memory>
-#include "base/base_export.h"
-
-namespace base {
-
-class FilePath;
-class TimeDelta;
-class UnguessableToken;
-class Value;
-
-// The caller takes ownership of the returned value.
-BASE_EXPORT std::unique_ptr<Value> CreateFilePathValue(
-    const FilePath& in_value);
-BASE_EXPORT bool GetValueAsFilePath(const Value& value, FilePath* file_path);
-
-BASE_EXPORT std::unique_ptr<Value> CreateTimeDeltaValue(const TimeDelta& time);
-BASE_EXPORT bool GetValueAsTimeDelta(const Value& value, TimeDelta* time);
-
-BASE_EXPORT std::unique_ptr<Value> CreateUnguessableTokenValue(
-    const UnguessableToken& token);
-BASE_EXPORT bool GetValueAsUnguessableToken(const Value& value,
-                                            UnguessableToken* token);
-
-}  // namespace base
-
-#endif  // BASE_VALUE_CONVERSIONS_H_
diff --git a/base/version.cc b/base/version.cc
deleted file mode 100644
index 3a54607..0000000
--- a/base/version.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/version.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-
-namespace base {
-
-namespace {
-
-// Parses the |numbers| vector representing the different numbers
-// inside the version string and constructs a vector of valid integers. It stops
-// when it reaches an invalid item (including the wildcard character). |parsed|
-// is the resulting integer vector. Function returns true if all numbers were
-// parsed successfully, false otherwise.
-bool ParseVersionNumbers(const std::string& version_str,
-                         std::vector<uint32_t>* parsed) {
-  std::vector<StringPiece> numbers =
-      SplitStringPiece(version_str, ".", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  if (numbers.empty())
-    return false;
-
-  for (auto it = numbers.begin(); it != numbers.end(); ++it) {
-    if (StartsWith(*it, "+", CompareCase::SENSITIVE))
-      return false;
-
-    unsigned int num;
-    if (!StringToUint(*it, &num))
-      return false;
-
-    // This throws out leading zeros for the first item only.
-    if (it == numbers.begin() && UintToString(num) != *it)
-      return false;
-
-    // StringToUint returns unsigned int but Version fields are uint32_t.
-    static_assert(sizeof (uint32_t) == sizeof (unsigned int),
-        "uint32_t must be same as unsigned int");
-    parsed->push_back(num);
-  }
-  return true;
-}
-
-// Compares version components in |components1| with components in
-// |components2|. Returns -1, 0 or 1 if |components1| is less than, equal to,
-// or greater than |components2|, respectively.
-int CompareVersionComponents(const std::vector<uint32_t>& components1,
-                             const std::vector<uint32_t>& components2) {
-  const size_t count = std::min(components1.size(), components2.size());
-  for (size_t i = 0; i < count; ++i) {
-    if (components1[i] > components2[i])
-      return 1;
-    if (components1[i] < components2[i])
-      return -1;
-  }
-  if (components1.size() > components2.size()) {
-    for (size_t i = count; i < components1.size(); ++i) {
-      if (components1[i] > 0)
-        return 1;
-    }
-  } else if (components1.size() < components2.size()) {
-    for (size_t i = count; i < components2.size(); ++i) {
-      if (components2[i] > 0)
-        return -1;
-    }
-  }
-  return 0;
-}
-
-}  // namespace
-
-Version::Version() = default;
-
-Version::Version(const Version& other) = default;
-
-Version::~Version() = default;
-
-Version::Version(const std::string& version_str) {
-  std::vector<uint32_t> parsed;
-  if (!ParseVersionNumbers(version_str, &parsed))
-    return;
-
-  components_.swap(parsed);
-}
-
-Version::Version(std::vector<uint32_t> components)
-    : components_(std::move(components)) {}
-
-bool Version::IsValid() const {
-  return (!components_.empty());
-}
-
-// static
-bool Version::IsValidWildcardString(const std::string& wildcard_string) {
-  std::string version_string = wildcard_string;
-  if (EndsWith(version_string, ".*", CompareCase::SENSITIVE))
-    version_string.resize(version_string.size() - 2);
-
-  Version version(version_string);
-  return version.IsValid();
-}
-
-int Version::CompareToWildcardString(const std::string& wildcard_string) const {
-  DCHECK(IsValid());
-  DCHECK(Version::IsValidWildcardString(wildcard_string));
-
-  // Default behavior if the string doesn't end with a wildcard.
-  if (!EndsWith(wildcard_string, ".*", CompareCase::SENSITIVE)) {
-    Version version(wildcard_string);
-    DCHECK(version.IsValid());
-    return CompareTo(version);
-  }
-
-  std::vector<uint32_t> parsed;
-  const bool success = ParseVersionNumbers(
-      wildcard_string.substr(0, wildcard_string.length() - 2), &parsed);
-  DCHECK(success);
-  const int comparison = CompareVersionComponents(components_, parsed);
-  // If the version is smaller than the wildcard version's |parsed| vector,
-  // then the wildcard has no effect (e.g. comparing 1.2.3 and 1.3.*) and the
-  // version is still smaller. Same logic for equality (e.g. comparing 1.2.2 to
-  // 1.2.2.* is 0 regardless of the wildcard). Under this logic,
-  // 1.2.0.0.0.0 compared to 1.2.* is 0.
-  if (comparison == -1 || comparison == 0)
-    return comparison;
-
-  // Catch the case where the digits of |parsed| are found in |components_|,
-  // which means that the two are equal since |parsed| has a trailing "*".
-  // (e.g. 1.2.3 vs. 1.2.* will return 0). All other cases return 1 since
-  // components is greater (e.g. 3.2.3 vs 1.*).
-  DCHECK_GT(parsed.size(), 0UL);
-  const size_t min_num_comp = std::min(components_.size(), parsed.size());
-  for (size_t i = 0; i < min_num_comp; ++i) {
-    if (components_[i] != parsed[i])
-      return 1;
-  }
-  return 0;
-}
-
-int Version::CompareTo(const Version& other) const {
-  DCHECK(IsValid());
-  DCHECK(other.IsValid());
-  return CompareVersionComponents(components_, other.components_);
-}
-
-const std::string Version::GetString() const {
-  DCHECK(IsValid());
-  std::string version_str;
-  size_t count = components_.size();
-  for (size_t i = 0; i < count - 1; ++i) {
-    version_str.append(UintToString(components_[i]));
-    version_str.append(".");
-  }
-  version_str.append(UintToString(components_[count - 1]));
-  return version_str;
-}
-
-bool operator==(const Version& v1, const Version& v2) {
-  return v1.CompareTo(v2) == 0;
-}
-
-bool operator!=(const Version& v1, const Version& v2) {
-  return !(v1 == v2);
-}
-
-bool operator<(const Version& v1, const Version& v2) {
-  return v1.CompareTo(v2) < 0;
-}
-
-bool operator<=(const Version& v1, const Version& v2) {
-  return v1.CompareTo(v2) <= 0;
-}
-
-bool operator>(const Version& v1, const Version& v2) {
-  return v1.CompareTo(v2) > 0;
-}
-
-bool operator>=(const Version& v1, const Version& v2) {
-  return v1.CompareTo(v2) >= 0;
-}
-
-std::ostream& operator<<(std::ostream& stream, const Version& v) {
-  return stream << v.GetString();
-}
-
-}  // namespace base
diff --git a/base/version.h b/base/version.h
deleted file mode 100644
index b3a0956..0000000
--- a/base/version.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_VERSION_H_
-#define BASE_VERSION_H_
-
-#include <stdint.h>
-
-#include <iosfwd>
-#include <string>
-#include <vector>
-
-#include "base/base_export.h"
-
-namespace base {
-
-// Version represents a dotted version number, like "1.2.3.4", supporting
-// parsing and comparison.
-class BASE_EXPORT Version {
- public:
-  // The only thing you can legally do to a default constructed
-  // Version object is assign to it.
-  Version();
-
-  Version(const Version& other);
-
-  // Initializes from a decimal dotted version number, like "0.1.1".
-  // Each component is limited to a uint16_t. Call IsValid() to learn
-  // the outcome.
-  explicit Version(const std::string& version_str);
-
-  // Initializes from a vector of components, like {1, 2, 3, 4}. Call IsValid()
-  // to learn the outcome.
-  explicit Version(std::vector<uint32_t> components);
-
-  ~Version();
-
-  // Returns true if the object contains a valid version number.
-  bool IsValid() const;
-
-  // Returns true if the version wildcard string is valid. The version wildcard
-  // string may end with ".*" (e.g. 1.2.*, 1.*). Any other arrangement with "*"
-  // is invalid (e.g. 1.*.3 or 1.2.3*). This functions defaults to standard
-  // Version behavior (IsValid) if no wildcard is present.
-  static bool IsValidWildcardString(const std::string& wildcard_string);
-
-  // Returns -1, 0, 1 for <, ==, >.
-  int CompareTo(const Version& other) const;
-
-  // Given a valid version object, compare if a |wildcard_string| results in a
-  // newer version. This function will default to CompareTo if the string does
-  // not end in wildcard sequence ".*". IsValidWildcard(wildcard_string) must be
-  // true before using this function.
-  int CompareToWildcardString(const std::string& wildcard_string) const;
-
-  // Return the string representation of this version.
-  const std::string GetString() const;
-
-  const std::vector<uint32_t>& components() const { return components_; }
-
- private:
-  std::vector<uint32_t> components_;
-};
-
-BASE_EXPORT bool operator==(const Version& v1, const Version& v2);
-BASE_EXPORT bool operator!=(const Version& v1, const Version& v2);
-BASE_EXPORT bool operator<(const Version& v1, const Version& v2);
-BASE_EXPORT bool operator<=(const Version& v1, const Version& v2);
-BASE_EXPORT bool operator>(const Version& v1, const Version& v2);
-BASE_EXPORT bool operator>=(const Version& v1, const Version& v2);
-BASE_EXPORT std::ostream& operator<<(std::ostream& stream, const Version& v);
-
-}  // namespace base
-
-#endif  // BASE_VERSION_H_
diff --git a/build/gen.py b/build/gen.py
index 95f8fe1..9e2ab8f 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -342,7 +342,6 @@
         'base/time/time.cc',
         'base/timer/elapsed_timer.cc',
         'base/timer/timer.cc',
-        'base/unguessable_token.cc',
         'base/value_iterators.cc',
         'base/values.cc',
         'base/vlog.cc',
