text: /**
   * Copyright (c) 2013-present, Facebook, Inc.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   *
   * @providesModule UserAgent
   */
  
  'use strict';
  
  const UserAgentData = require('./UserAgentData');
  const VersionRange = require('./VersionRange');
  
  const mapObject = require('./mapObject');
  const memoizeStringOnly = require('./memoizeStringOnly');
  
  /**
   * Checks to see whether `name` and `version` satisfy `query`.
   *
   * @param {string} name Name of the browser, device, engine or platform
   * @param {?string} version Version of the browser, engine or platform
   * @param {string} query Query of form "Name [range expression]"
   * @param {?function} normalizer Optional pre-processor for range expression
   * @return {boolean}
   */
  function compare(name, version, query, normalizer) {
    // check for exact match with no version
    if (name === query) {
      return true;
    }
  
    // check for non-matching names
    if (!query.startsWith(name)) {
      return false;
    }
  
    // full comparison with version
    let range = query.slice(name.length);
    if (version) {
      range = normalizer ? normalizer(range) : range;
      return VersionRange.contains(range, version);
    }
  
    return false;
  }
  
  /**
   * Normalizes `version` by stripping any "NT" prefix, but only on the Windows
   * platform.
   *
   * Mimics the stripping performed by the `UserAgentWindowsPlatform` PHP class.
   *
   * @param {string} version
   * @return {string}
   */
  function normalizePlatformVersion(version) {
    if (UserAgentData.platformName === 'Windows') {
      return version.replace(/^\s*NT/, '');
    }
  
    return version;
  }
  
  /**
   * Provides client-side access to the authoritative PHP-generated User Agent
   * information supplied by the server.
   */
  const UserAgent = {
    /**
     * Check if the User Agent browser matches `query`.
     *
     * `query` should be a string like "Chrome" or "Chrome > 33".
     *
     * Valid browser names include:
     *
     * - ACCESS NetFront
     * - AOL
     * - Amazon Silk
     * - Android
     * - BlackBerry
     * - BlackBerry PlayBook
     * - Chrome
     * - Chrome for iOS
     * - Chrome frame
     * - Facebook PHP SDK
     * - Facebook for iOS
     * - Firefox
     * - IE
     * - IE Mobile
     * - Mobile Safari
     * - Motorola Internet Browser
     * - Nokia
     * - Openwave Mobile Browser
     * - Opera
     * - Opera Mini
     * - Opera Mobile
     * - Safari
     * - UIWebView
     * - Unknown
     * - webOS
     * - etc...
     *
     * An authoritative list can be found in the PHP `BrowserDetector` class and
     * related classes in the same file (see calls to `new UserAgentBrowser` here:
     * https://fburl.com/50728104).
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "Name [range expression]"
     * @return {boolean}
     */
    isBrowser(query) {
      return compare(UserAgentData.browserName, UserAgentData.browserFullVersion, query);
    },
  
    /**
     * Check if the User Agent browser uses a 32 or 64 bit architecture.
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "32" or "64".
     * @return {boolean}
     */
    isBrowserArchitecture(query) {
      return compare(UserAgentData.browserArchitecture, null, query);
    },
  
    /**
     * Check if the User Agent device matches `query`.
     *
     * `query` should be a string like "iPhone" or "iPad".
     *
     * Valid device names include:
     *
     * - Kindle
     * - Kindle Fire
     * - Unknown
     * - iPad
     * - iPhone
     * - iPod
     * - etc...
     *
     * An authoritative list can be found in the PHP `DeviceDetector` class and
     * related classes in the same file (see calls to `new UserAgentDevice` here:
     * https://fburl.com/50728332).
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "Name"
     * @return {boolean}
     */
    isDevice(query) {
      return compare(UserAgentData.deviceName, null, query);
    },
  
    /**
     * Check if the User Agent rendering engine matches `query`.
     *
     * `query` should be a string like "WebKit" or "WebKit >= 537".
     *
     * Valid engine names include:
     *
     * - Gecko
     * - Presto
     * - Trident
     * - WebKit
     * - etc...
     *
     * An authoritative list can be found in the PHP `RenderingEngineDetector`
     * class related classes in the same file (see calls to `new
     * UserAgentRenderingEngine` here: https://fburl.com/50728617).
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "Name [range expression]"
     * @return {boolean}
     */
    isEngine(query) {
      return compare(UserAgentData.engineName, UserAgentData.engineVersion, query);
    },
  
    /**
     * Check if the User Agent platform matches `query`.
     *
     * `query` should be a string like "Windows" or "iOS 5 - 6".
     *
     * Valid platform names include:
     *
     * - Android
     * - BlackBerry OS
     * - Java ME
     * - Linux
     * - Mac OS X
     * - Mac OS X Calendar
     * - Mac OS X Internet Account
     * - Symbian
     * - SymbianOS
     * - Windows
     * - Windows Mobile
     * - Windows Phone
     * - iOS
     * - iOS Facebook Integration Account
     * - iOS Facebook Social Sharing UI
     * - webOS
     * - Chrome OS
     * - etc...
     *
     * An authoritative list can be found in the PHP `PlatformDetector` class and
     * related classes in the same file (see calls to `new UserAgentPlatform`
     * here: https://fburl.com/50729226).
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "Name [range expression]"
     * @return {boolean}
     */
    isPlatform(query) {
      return compare(UserAgentData.platformName, UserAgentData.platformFullVersion, query, normalizePlatformVersion);
    },
  
    /**
     * Check if the User Agent platform is a 32 or 64 bit architecture.
     *
     * @note Function results are memoized
     *
     * @param {string} query Query of the form "32" or "64".
     * @return {boolean}
     */
    isPlatformArchitecture(query) {
      return compare(UserAgentData.platformArchitecture, null, query);
    }
  
  };
  
  module.exports = mapObject(UserAgent, memoizeStringOnly);