diff --git a/base/base64.cc b/base/base64.cc
deleted file mode 100644
index ca8ee93..0000000
--- a/base/base64.cc
+++ /dev/null
@@ -1,39 +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/base64.h"
-
-#include <stddef.h>
-
-#include "third_party/modp_b64/modp_b64.h"
-
-namespace base {
-
-void Base64Encode(const StringPiece& input, std::string* output) {
-  std::string temp;
-  temp.resize(modp_b64_encode_len(input.size()));  // makes room for null byte
-
-  // modp_b64_encode_len() returns at least 1, so temp[0] is safe to use.
-  size_t output_size = modp_b64_encode(&(temp[0]), input.data(), input.size());
-
-  temp.resize(output_size);  // strips off null byte
-  output->swap(temp);
-}
-
-bool Base64Decode(const StringPiece& input, std::string* output) {
-  std::string temp;
-  temp.resize(modp_b64_decode_len(input.size()));
-
-  // does not null terminate result since result is binary data!
-  size_t input_size = input.size();
-  size_t output_size = modp_b64_decode(&(temp[0]), input.data(), input_size);
-  if (output_size == MODP_B64_ERROR)
-    return false;
-
-  temp.resize(output_size);
-  output->swap(temp);
-  return true;
-}
-
-}  // namespace base
diff --git a/base/base64.h b/base/base64.h
deleted file mode 100644
index dd72c39..0000000
--- a/base/base64.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_BASE64_H_
-#define BASE_BASE64_H_
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-
-// Encodes the input string in base64. The encoding can be done in-place.
-BASE_EXPORT void Base64Encode(const StringPiece& input, std::string* output);
-
-// Decodes the base64 input string.  Returns true if successful and false
-// otherwise. The output string is only modified if successful. The decoding can
-// be done in-place.
-BASE_EXPORT bool Base64Decode(const StringPiece& input, std::string* output);
-
-}  // namespace base
-
-#endif  // BASE_BASE64_H_
diff --git a/base/base64_decode_fuzzer.cc b/base/base64_decode_fuzzer.cc
deleted file mode 100644
index 3716f72..0000000
--- a/base/base64_decode_fuzzer.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/base64.h"
-#include "base/strings/string_piece.h"
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  std::string decode_output;
-  base::StringPiece data_piece(reinterpret_cast<const char*>(data), size);
-  base::Base64Decode(data_piece, &decode_output);
-  return 0;
-}
diff --git a/base/base64_encode_fuzzer.cc b/base/base64_encode_fuzzer.cc
deleted file mode 100644
index c324be0..0000000
--- a/base/base64_encode_fuzzer.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/base64.h"
-#include "base/logging.h"
-#include "base/strings/string_piece.h"
-
-// Encode some random data, and then decode it.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  std::string encode_output;
-  std::string decode_output;
-  base::StringPiece data_piece(reinterpret_cast<const char*>(data), size);
-  base::Base64Encode(data_piece, &encode_output);
-  CHECK(base::Base64Decode(encode_output, &decode_output));
-  CHECK_EQ(data_piece, decode_output);
-  return 0;
-}
diff --git a/base/base64url.cc b/base/base64url.cc
deleted file mode 100644
index 0a2c045..0000000
--- a/base/base64url.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/base64url.h"
-
-#include <stddef.h>
-
-#include "base/base64.h"
-#include "base/macros.h"
-#include "base/numerics/safe_math.h"
-#include "base/strings/string_util.h"
-#include "third_party/modp_b64/modp_b64.h"
-
-namespace base {
-
-const char kPaddingChar = '=';
-
-// Base64url maps {+, /} to {-, _} in order for the encoded content to be safe
-// to use in a URL. These characters will be translated by this implementation.
-const char kBase64Chars[] = "+/";
-const char kBase64UrlSafeChars[] = "-_";
-
-void Base64UrlEncode(const StringPiece& input,
-                     Base64UrlEncodePolicy policy,
-                     std::string* output) {
-  Base64Encode(input, output);
-
-  ReplaceChars(*output, "+", "-", output);
-  ReplaceChars(*output, "/", "_", output);
-
-  switch (policy) {
-    case Base64UrlEncodePolicy::INCLUDE_PADDING:
-      // The padding included in |*output| will not be amended.
-      break;
-    case Base64UrlEncodePolicy::OMIT_PADDING:
-      // The padding included in |*output| will be removed.
-      const size_t last_non_padding_pos =
-          output->find_last_not_of(kPaddingChar);
-      if (last_non_padding_pos != std::string::npos)
-        output->resize(last_non_padding_pos + 1);
-
-      break;
-  }
-}
-
-bool Base64UrlDecode(const StringPiece& input,
-                     Base64UrlDecodePolicy policy,
-                     std::string* output) {
-  // Characters outside of the base64url alphabet are disallowed, which includes
-  // the {+, /} characters found in the conventional base64 alphabet.
-  if (input.find_first_of(kBase64Chars) != std::string::npos)
-    return false;
-
-  const size_t required_padding_characters = input.size() % 4;
-  const bool needs_replacement =
-      input.find_first_of(kBase64UrlSafeChars) != std::string::npos;
-
-  switch (policy) {
-    case Base64UrlDecodePolicy::REQUIRE_PADDING:
-      // Fail if the required padding is not included in |input|.
-      if (required_padding_characters > 0)
-        return false;
-      break;
-    case Base64UrlDecodePolicy::IGNORE_PADDING:
-      // Missing padding will be silently appended.
-      break;
-    case Base64UrlDecodePolicy::DISALLOW_PADDING:
-      // Fail if padding characters are included in |input|.
-      if (input.find_first_of(kPaddingChar) != std::string::npos)
-        return false;
-      break;
-  }
-
-  // If the string either needs replacement of URL-safe characters to normal
-  // base64 ones, or additional padding, a copy of |input| needs to be made in
-  // order to make these adjustments without side effects.
-  if (required_padding_characters > 0 || needs_replacement) {
-    std::string base64_input;
-
-    CheckedNumeric<size_t> base64_input_size = input.size();
-    if (required_padding_characters > 0)
-      base64_input_size += 4 - required_padding_characters;
-
-    base64_input.reserve(base64_input_size.ValueOrDie());
-    input.AppendToString(&base64_input);
-
-    // Substitute the base64url URL-safe characters to their base64 equivalents.
-    ReplaceChars(base64_input, "-", "+", &base64_input);
-    ReplaceChars(base64_input, "_", "/", &base64_input);
-
-    // Append the necessary padding characters.
-    base64_input.resize(base64_input_size.ValueOrDie(), '=');
-
-    return Base64Decode(base64_input, output);
-  }
-
-  return Base64Decode(input, output);
-}
-
-}  // namespace base
diff --git a/base/base64url.h b/base/base64url.h
deleted file mode 100644
index 66a4824..0000000
--- a/base/base64url.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_BASE64URL_H_
-#define BASE_BASE64URL_H_
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-
-enum class Base64UrlEncodePolicy {
-  // Include the trailing padding in the output, when necessary.
-  INCLUDE_PADDING,
-
-  // Remove the trailing padding from the output.
-  OMIT_PADDING
-};
-
-// Encodes the |input| string in base64url, defined in RFC 4648:
-// https://tools.ietf.org/html/rfc4648#section-5
-//
-// The |policy| defines whether padding should be included or omitted from the
-// encoded |*output|. |input| and |*output| may reference the same storage.
-BASE_EXPORT void Base64UrlEncode(const StringPiece& input,
-                                 Base64UrlEncodePolicy policy,
-                                 std::string* output);
-
-enum class Base64UrlDecodePolicy {
-  // Require inputs contain trailing padding if non-aligned.
-  REQUIRE_PADDING,
-
-  // Accept inputs regardless of whether or not they have the correct padding.
-  IGNORE_PADDING,
-
-  // Reject inputs if they contain any trailing padding.
-  DISALLOW_PADDING
-};
-
-// Decodes the |input| string in base64url, defined in RFC 4648:
-// https://tools.ietf.org/html/rfc4648#section-5
-//
-// The |policy| defines whether padding will be required, ignored or disallowed
-// altogether. |input| and |*output| may reference the same storage.
-BASE_EXPORT bool Base64UrlDecode(const StringPiece& input,
-                                 Base64UrlDecodePolicy policy,
-                                 std::string* output) WARN_UNUSED_RESULT;
-
-}  // namespace base
-
-#endif  // BASE_BASE64URL_H_
diff --git a/base/file_version_info.h b/base/file_version_info.h
deleted file mode 100644
index 3240bbe..0000000
--- a/base/file_version_info.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_FILE_VERSION_INFO_H_
-#define BASE_FILE_VERSION_INFO_H_
-
-#include <string>
-
-#include "build_config.h"
-#include "base/base_export.h"
-#include "base/strings/string16.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace base {
-class FilePath;
-}
-
-// Provides an interface for accessing the version information for a file. This
-// is the information you access when you select a file in the Windows Explorer,
-// right-click select Properties, then click the Version tab, and on the Mac
-// when you select a file in the Finder and do a Get Info.
-//
-// This list of properties is straight out of Win32's VerQueryValue
-// <http://msdn.microsoft.com/en-us/library/ms647464.aspx> and the Mac
-// version returns values from the Info.plist as appropriate. TODO(avi): make
-// this a less-obvious Windows-ism.
-
-class BASE_EXPORT FileVersionInfo {
- public:
-  virtual ~FileVersionInfo() {}
-#if defined(OS_WIN) || defined(OS_MACOSX)
-  // Creates a FileVersionInfo for the specified path. Returns NULL if something
-  // goes wrong (typically the file does not exit or cannot be opened). The
-  // returned object should be deleted when you are done with it.
-  static FileVersionInfo* CreateFileVersionInfo(
-      const base::FilePath& file_path);
-#endif  // OS_WIN || OS_MACOSX
-
-#if defined(OS_WIN)
-  // Creates a FileVersionInfo for the specified module. Returns NULL in case
-  // of error. The returned object should be deleted when you are done with it.
-  static FileVersionInfo* CreateFileVersionInfoForModule(HMODULE module);
-#else
-  // Creates a FileVersionInfo for the current module. Returns NULL in case
-  // of error. The returned object should be deleted when you are done with it.
-  static FileVersionInfo* CreateFileVersionInfoForCurrentModule();
-#endif  // OS_WIN
-
-  // Accessors to the different version properties.
-  // Returns an empty string if the property is not found.
-  virtual base::string16 company_name() = 0;
-  virtual base::string16 company_short_name() = 0;
-  virtual base::string16 product_name() = 0;
-  virtual base::string16 product_short_name() = 0;
-  virtual base::string16 internal_name() = 0;
-  virtual base::string16 product_version() = 0;
-  virtual base::string16 private_build() = 0;
-  virtual base::string16 special_build() = 0;
-  virtual base::string16 comments() = 0;
-  virtual base::string16 original_filename() = 0;
-  virtual base::string16 file_description() = 0;
-  virtual base::string16 file_version() = 0;
-  virtual base::string16 legal_copyright() = 0;
-  virtual base::string16 legal_trademarks() = 0;
-  virtual base::string16 last_change() = 0;
-  virtual bool is_official_build() = 0;
-};
-
-#endif  // BASE_FILE_VERSION_INFO_H_
diff --git a/base/file_version_info_mac.h b/base/file_version_info_mac.h
deleted file mode 100644
index 9cc4b10..0000000
--- a/base/file_version_info_mac.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_FILE_VERSION_INFO_MAC_H_
-#define BASE_FILE_VERSION_INFO_MAC_H_
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <string>
-
-#include "base/file_version_info.h"
-#include "base/mac/scoped_nsobject.h"
-#include "base/macros.h"
-
-@class NSBundle;
-
-class FileVersionInfoMac : public FileVersionInfo {
- public:
-  explicit FileVersionInfoMac(NSBundle *bundle);
-  ~FileVersionInfoMac() override;
-
-  // Accessors to the different version properties.
-  // Returns an empty string if the property is not found.
-  base::string16 company_name() override;
-  base::string16 company_short_name() override;
-  base::string16 product_name() override;
-  base::string16 product_short_name() override;
-  base::string16 internal_name() override;
-  base::string16 product_version() override;
-  base::string16 private_build() override;
-  base::string16 special_build() override;
-  base::string16 comments() override;
-  base::string16 original_filename() override;
-  base::string16 file_description() override;
-  base::string16 file_version() override;
-  base::string16 legal_copyright() override;
-  base::string16 legal_trademarks() override;
-  base::string16 last_change() override;
-  bool is_official_build() override;
-
- private:
-  // Returns a base::string16 value for a property name.
-  // Returns the empty string if the property does not exist.
-  base::string16 GetString16Value(CFStringRef name);
-
-  base::scoped_nsobject<NSBundle> bundle_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileVersionInfoMac);
-};
-
-#endif  // BASE_FILE_VERSION_INFO_MAC_H_
diff --git a/base/file_version_info_mac.mm b/base/file_version_info_mac.mm
deleted file mode 100644
index ec0743c..0000000
--- a/base/file_version_info_mac.mm
+++ /dev/null
@@ -1,124 +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/file_version_info_mac.h"
-
-#import <Foundation/Foundation.h>
-
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#include "base/mac/foundation_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "build_config.h"
-
-FileVersionInfoMac::FileVersionInfoMac(NSBundle *bundle)
-    : bundle_([bundle retain]) {
-}
-
-FileVersionInfoMac::~FileVersionInfoMac() {}
-
-// static
-FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForCurrentModule() {
-  return CreateFileVersionInfo(base::mac::FrameworkBundlePath());
-}
-
-// static
-FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
-    const base::FilePath& file_path) {
-  NSString* path = base::SysUTF8ToNSString(file_path.value());
-  NSBundle* bundle = [NSBundle bundleWithPath:path];
-  return new FileVersionInfoMac(bundle);
-}
-
-base::string16 FileVersionInfoMac::company_name() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::company_short_name() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::internal_name() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::product_name() {
-  return GetString16Value(kCFBundleNameKey);
-}
-
-base::string16 FileVersionInfoMac::product_short_name() {
-  return GetString16Value(kCFBundleNameKey);
-}
-
-base::string16 FileVersionInfoMac::comments() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::legal_copyright() {
-  return GetString16Value(CFSTR("CFBundleGetInfoString"));
-}
-
-base::string16 FileVersionInfoMac::product_version() {
-  // On OS X, CFBundleVersion is used by LaunchServices, and must follow
-  // specific formatting rules, so the four-part Chrome version is in
-  // CFBundleShortVersionString. On iOS, both have a policy-enfoced limit
-  // of three version components, so the full version is stored in a custom
-  // key (CrBundleVersion) falling back to CFBundleVersion if not present.
-#if defined(OS_IOS)
-  base::string16 version(GetString16Value(CFSTR("CrBundleVersion")));
-  if (version.length() > 0)
-    return version;
-  return GetString16Value(CFSTR("CFBundleVersion"));
-#else
-  return GetString16Value(CFSTR("CFBundleShortVersionString"));
-#endif  // defined(OS_IOS)
-}
-
-base::string16 FileVersionInfoMac::file_description() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::legal_trademarks() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::private_build() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::file_version() {
-  return product_version();
-}
-
-base::string16 FileVersionInfoMac::original_filename() {
-  return GetString16Value(kCFBundleNameKey);
-}
-
-base::string16 FileVersionInfoMac::special_build() {
-  return base::string16();
-}
-
-base::string16 FileVersionInfoMac::last_change() {
-  return GetString16Value(CFSTR("SCMRevision"));
-}
-
-bool FileVersionInfoMac::is_official_build() {
-#if defined (GOOGLE_CHROME_BUILD)
-  return true;
-#else
-  return false;
-#endif
-}
-
-base::string16 FileVersionInfoMac::GetString16Value(CFStringRef name) {
-  if (bundle_) {
-    NSString *ns_name = base::mac::CFToNSCast(name);
-    NSString* value = [bundle_ objectForInfoDictionaryKey:ns_name];
-    if (value) {
-      return base::SysNSStringToUTF16(value);
-    }
-  }
-  return base::string16();
-}
diff --git a/base/file_version_info_win.cc b/base/file_version_info_win.cc
deleted file mode 100644
index 4affd81..0000000
--- a/base/file_version_info_win.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/file_version_info_win.h"
-
-#include <windows.h>
-#include <stddef.h>
-
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/win/resource_util.h"
-
-using base::FilePath;
-
-namespace {
-
-struct LanguageAndCodePage {
-  WORD language;
-  WORD code_page;
-};
-
-// Returns the \\VarFileInfo\\Translation value extracted from the
-// VS_VERSION_INFO resource in |data|.
-LanguageAndCodePage* GetTranslate(const void* data) {
-  LanguageAndCodePage* translate = nullptr;
-  UINT length;
-  if (::VerQueryValue(data, L"\\VarFileInfo\\Translation",
-                      reinterpret_cast<void**>(&translate), &length)) {
-    return translate;
-  }
-  return nullptr;
-}
-
-VS_FIXEDFILEINFO* GetVsFixedFileInfo(const void* data) {
-  VS_FIXEDFILEINFO* fixed_file_info = nullptr;
-  UINT length;
-  if (::VerQueryValue(data, L"\\", reinterpret_cast<void**>(&fixed_file_info),
-                      &length)) {
-    return fixed_file_info;
-  }
-  return nullptr;
-}
-
-}  // namespace
-
-FileVersionInfoWin::~FileVersionInfoWin() = default;
-
-// static
-FileVersionInfo* FileVersionInfo::CreateFileVersionInfoForModule(
-    HMODULE module) {
-  void* data;
-  size_t version_info_length;
-  const bool has_version_resource = base::win::GetResourceFromModule(
-      module, VS_VERSION_INFO, RT_VERSION, &data, &version_info_length);
-  if (!has_version_resource)
-    return nullptr;
-
-  const LanguageAndCodePage* translate = GetTranslate(data);
-  if (!translate)
-    return nullptr;
-
-  return new FileVersionInfoWin(data, translate->language,
-                                translate->code_page);
-}
-
-// static
-FileVersionInfo* FileVersionInfo::CreateFileVersionInfo(
-    const FilePath& file_path) {
-  base::AssertBlockingAllowed();
-
-  DWORD dummy;
-  const wchar_t* path = file_path.value().c_str();
-  const DWORD length = ::GetFileVersionInfoSize(path, &dummy);
-  if (length == 0)
-    return nullptr;
-
-  std::vector<uint8_t> data(length, 0);
-
-  if (!::GetFileVersionInfo(path, dummy, length, data.data()))
-    return nullptr;
-
-  const LanguageAndCodePage* translate = GetTranslate(data.data());
-  if (!translate)
-    return nullptr;
-
-  return new FileVersionInfoWin(std::move(data), translate->language,
-                                translate->code_page);
-}
-
-base::string16 FileVersionInfoWin::company_name() {
-  return GetStringValue(L"CompanyName");
-}
-
-base::string16 FileVersionInfoWin::company_short_name() {
-  return GetStringValue(L"CompanyShortName");
-}
-
-base::string16 FileVersionInfoWin::internal_name() {
-  return GetStringValue(L"InternalName");
-}
-
-base::string16 FileVersionInfoWin::product_name() {
-  return GetStringValue(L"ProductName");
-}
-
-base::string16 FileVersionInfoWin::product_short_name() {
-  return GetStringValue(L"ProductShortName");
-}
-
-base::string16 FileVersionInfoWin::comments() {
-  return GetStringValue(L"Comments");
-}
-
-base::string16 FileVersionInfoWin::legal_copyright() {
-  return GetStringValue(L"LegalCopyright");
-}
-
-base::string16 FileVersionInfoWin::product_version() {
-  return GetStringValue(L"ProductVersion");
-}
-
-base::string16 FileVersionInfoWin::file_description() {
-  return GetStringValue(L"FileDescription");
-}
-
-base::string16 FileVersionInfoWin::legal_trademarks() {
-  return GetStringValue(L"LegalTrademarks");
-}
-
-base::string16 FileVersionInfoWin::private_build() {
-  return GetStringValue(L"PrivateBuild");
-}
-
-base::string16 FileVersionInfoWin::file_version() {
-  return GetStringValue(L"FileVersion");
-}
-
-base::string16 FileVersionInfoWin::original_filename() {
-  return GetStringValue(L"OriginalFilename");
-}
-
-base::string16 FileVersionInfoWin::special_build() {
-  return GetStringValue(L"SpecialBuild");
-}
-
-base::string16 FileVersionInfoWin::last_change() {
-  return GetStringValue(L"LastChange");
-}
-
-bool FileVersionInfoWin::is_official_build() {
-  return (GetStringValue(L"Official Build").compare(L"1") == 0);
-}
-
-bool FileVersionInfoWin::GetValue(const wchar_t* name,
-                                  std::wstring* value_str) {
-  WORD lang_codepage[8];
-  size_t i = 0;
-  // Use the language and codepage from the DLL.
-  lang_codepage[i++] = language_;
-  lang_codepage[i++] = code_page_;
-  // Use the default language and codepage from the DLL.
-  lang_codepage[i++] = ::GetUserDefaultLangID();
-  lang_codepage[i++] = code_page_;
-  // Use the language from the DLL and Latin codepage (most common).
-  lang_codepage[i++] = language_;
-  lang_codepage[i++] = 1252;
-  // Use the default language and Latin codepage (most common).
-  lang_codepage[i++] = ::GetUserDefaultLangID();
-  lang_codepage[i++] = 1252;
-
-  i = 0;
-  while (i < arraysize(lang_codepage)) {
-    wchar_t sub_block[MAX_PATH];
-    WORD language = lang_codepage[i++];
-    WORD code_page = lang_codepage[i++];
-    _snwprintf_s(sub_block, MAX_PATH, MAX_PATH,
-                 L"\\StringFileInfo\\%04x%04x\\%ls", language, code_page, name);
-    LPVOID value = NULL;
-    uint32_t size;
-    BOOL r = ::VerQueryValue(data_, sub_block, &value, &size);
-    if (r && value) {
-      value_str->assign(static_cast<wchar_t*>(value));
-      return true;
-    }
-  }
-  return false;
-}
-
-std::wstring FileVersionInfoWin::GetStringValue(const wchar_t* name) {
-  std::wstring str;
-  if (GetValue(name, &str))
-    return str;
-  else
-    return L"";
-}
-
-FileVersionInfoWin::FileVersionInfoWin(std::vector<uint8_t>&& data,
-                                       WORD language,
-                                       WORD code_page)
-    : owned_data_(std::move(data)),
-      data_(owned_data_.data()),
-      language_(language),
-      code_page_(code_page),
-      fixed_file_info_(GetVsFixedFileInfo(data_)) {
-  DCHECK(!owned_data_.empty());
-}
-
-FileVersionInfoWin::FileVersionInfoWin(void* data,
-                                       WORD language,
-                                       WORD code_page)
-    : data_(data),
-      language_(language),
-      code_page_(code_page),
-      fixed_file_info_(GetVsFixedFileInfo(data)) {
-  DCHECK(data_);
-}
diff --git a/base/file_version_info_win.h b/base/file_version_info_win.h
deleted file mode 100644
index d91b67f..0000000
--- a/base/file_version_info_win.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_FILE_VERSION_INFO_WIN_H_
-#define BASE_FILE_VERSION_INFO_WIN_H_
-
-#include <windows.h>
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/base_export.h"
-#include "base/file_version_info.h"
-#include "base/macros.h"
-
-struct tagVS_FIXEDFILEINFO;
-typedef tagVS_FIXEDFILEINFO VS_FIXEDFILEINFO;
-
-class BASE_EXPORT FileVersionInfoWin : public FileVersionInfo {
- public:
-  ~FileVersionInfoWin() override;
-
-  // Accessors to the different version properties.
-  // Returns an empty string if the property is not found.
-  base::string16 company_name() override;
-  base::string16 company_short_name() override;
-  base::string16 product_name() override;
-  base::string16 product_short_name() override;
-  base::string16 internal_name() override;
-  base::string16 product_version() override;
-  base::string16 private_build() override;
-  base::string16 special_build() override;
-  base::string16 comments() override;
-  base::string16 original_filename() override;
-  base::string16 file_description() override;
-  base::string16 file_version() override;
-  base::string16 legal_copyright() override;
-  base::string16 legal_trademarks() override;
-  base::string16 last_change() override;
-  bool is_official_build() override;
-
-  // Lets you access other properties not covered above.
-  bool GetValue(const wchar_t* name, std::wstring* value);
-
-  // Similar to GetValue but returns a wstring (empty string if the property
-  // does not exist).
-  std::wstring GetStringValue(const wchar_t* name);
-
-  // Get the fixed file info if it exists. Otherwise NULL
-  const VS_FIXEDFILEINFO* fixed_file_info() const { return fixed_file_info_; }
-
- private:
-  friend FileVersionInfo;
-
-  // |data| is a VS_VERSION_INFO resource. |language| and |code_page| are
-  // extracted from the \VarFileInfo\Translation value of |data|.
-  FileVersionInfoWin(std::vector<uint8_t>&& data,
-                     WORD language,
-                     WORD code_page);
-  FileVersionInfoWin(void* data, WORD language, WORD code_page);
-
-  const std::vector<uint8_t> owned_data_;
-  const void* const data_;
-  const WORD language_;
-  const WORD code_page_;
-
-  // This is a pointer into |data_| if it exists. Otherwise nullptr.
-  const VS_FIXEDFILEINFO* const fixed_file_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileVersionInfoWin);
-};
-
-#endif  // BASE_FILE_VERSION_INFO_WIN_H_
diff --git a/build/gen.py b/build/gen.py
index 21b4008..01fe35f 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -683,7 +683,6 @@
         'base/debug/debugger_win.cc',
         'base/debug/profiler.cc',
         'base/debug/stack_trace_win.cc',
-        'base/file_version_info_win.cc',
         'base/files/file_enumerator_win.cc',
         'base/files/file_path_watcher_win.cc',
         'base/files/file_util_win.cc',
